我想做一个函数来存储一个完整的牌组,如下所示:
- 作为 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS...
依此类推,在动态链表上,每个节点只有一张卡片。 这是我尝试过的,但它不起作用。 请注意,卡座存储在.txt文件中。
void make_list(deck[52][3])
{
typedef struct cards
{
char card[3];
struct cards *next;
} cards_t;
int j;
cards_t *head = NULL; //initialization
head = (cards_t*) malloc (sizeof(cards_t));
for (j=0; j<52; j++)
{
head-> card[3] = deck[j][3];
head->(next + j) = (cards_t*) malloc(sizeof(cards_t));
}
我几乎是一个初学者,所以任何关于我的错误或解决方案的详细解释将不胜感激:)
我看到代码存在一些高级问题。
- 当你有一个双字符指针(甲板(时,你会访问一个字符作为
deck[x][y]
但如果你想要整个AS
那么你只需要deck[x]
。 - 您的
for
循环每次都会更改 head 的值,它没有列出列表。在 for 循环结束时,唯一更改的值将是 head 和 next。这也会导致大量内存泄漏,因为您错误地标记了新struct cards
但在下一次迭代中立即丢失了它的地址。 - 您对
head->card[3] = deck[j][3]
的访问权限无效。附在卡上的[3]
无效,应该只是head->card = deck[j]
。 - 链表不像你尝试的那样工作(下一个 + j(。这将更适合数组。对于列表,您必须在列表中导航以添加节点(或者可能具有指向列表末尾的指针(。 您的方法返回
- 是 void,但由于您在方法中定义了整个列表,因此它可能应该返回节点的头部,以便所有数据都可以从方法外部获得。同样重要的是要注意,如果
deck
变量超出范围,则列表将指向垃圾数据,因为它可能会在内存中被覆盖。如果你想避免这种情况,你需要确保套牌不会超出范围,或者对每张牌进行memcpy
或strcpy
。
如果你想初始化一个链卡列表,它更像
typedef struct cards //Should be done outside of function
{
char card[3]; //2 characters + ' '
struct cards * next;
} cards_t;
cards_t * make_list(char ** deck) //Assuming deck is double character array as you showed it
{
//Initialize values
int j = 0;
cards_t *head = malloc (sizeof(cards_t)); //Note it isn't required to cast from malloc
//Iterate over the deck and append to the linked list
//here, we will start our variable at the head of the list. We will repeat
//this iteration 53 times and after each iteration,
//the variable will move onto the next node of the linked list.
for (cards_t * iterator = head; j<52; iterator = iterator->next, j++)
{
iterator->card = deck[j]; //This will store the 3 card character name
iterator->next = malloc(sizeof(cards_t));
}//for
return head;
}//make_list