C语言 使用链表创建一副牌



我似乎想不通。出于某种原因,我的链表没有创建一副牌,甚至没有创建一个节点。如果有人能帮忙,我将不胜感激。我的所有代码都在下面。如果你能告诉我我做错了什么,并指出我正确的方向,那将非常有帮助。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SPADE "x06"
#define CLUB "x05"
#define DIAMONDS "x04"
#define HEART "x03"
typedef struct node {
int face_val;
char suit[10];
struct card_s * next;
} card;

void add_card(card **headp, card **tailp, int face, char suit) {
char suit2[10] = "Test";
*tailp = (card*)malloc(sizeof(card));
card *temp = (card*)malloc(sizeof(card));
temp->face_val = face;
temp->suit[10] = &suit2;
strcpy(temp->suit, suit2);
if (*headp == NULL) {
*headp = temp;
(*headp)->next = *tailp;
}
else {
(*tailp)->face_val = temp->face_val;
(*tailp)->suit[10] = temp->suit;
(*tailp)->next = malloc(sizeof(card));
*tailp = (*tailp)->next;
}
return;
}

void create_deck(card **headp, card **tailp) {
int i = 1;

while (i <= 13) {
int j = 1;
while (j <= 4) {

if (j == 1) {
add_card(headp,tailp,i,SPADE);
}
if (j == 2) {
add_card(headp,tailp,i,HEART);
}
if (j == 3) {
add_card(headp,tailp,i,DIAMONDS);
}
if (j == 4) {
add_card(headp,tailp,i,CLUB);
}
j++; 
}
i++;
}
return;
}

int main(void) {
card *headp=NULL;
card *tailp=NULL;
create_deck(&headp,&tailp);
}

正如其他人在评论中指出的那样,您犯了很多错误,例如分配卡片三次而不是一次,将字符串文字传递到 char 参数中并立即覆盖tailp而不检查其先前的值,毕竟这是您的 add_card 元素大部分时间都会操作的内容。我测试了你的代码,并纠正了一些错误。我能够看到卡片:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define SPADE "SPADE"
#define CLUB "CLUB"
#define DIAMONDS "DIAMOND"
#define HEART "HEART"
typedef struct node {
int face_val;
char suit[10];
struct node * next;
} card;

void add_card(card **headp, card **tailp, int face, const char* suit) {
card *temp = (card*)malloc(sizeof(card)); // allocate new card
temp->face_val = face; // assign face val
strcpy(temp->suit, suit); // assign suit
if (*headp == NULL) {
*headp = temp;
*tailp = temp;
}
else {
(*tailp)->next = temp;
*tailp = temp;
}
}

void create_deck(card **headp, card **tailp) {
int i = 1;
while (i <= 13) {
int j = 1;
while (j <= 4) {
if (j == 1) 
add_card(headp,tailp,i,SPADE);
if (j == 2) 
add_card(headp,tailp,i,HEART);
if (j == 3) 
add_card(headp,tailp,i,DIAMONDS);
if (j == 4) 
add_card(headp,tailp,i,CLUB);
j++; 
}
i++;
}
}
void printDeck(card *curNode) {
while(curNode != NULL) {
printf("face val : %d, SUIT : %sn", curNode->face_val, curNode->suit);
curNode = curNode->next;
}
}

int main(void) {
card *headp=NULL;
card *tailp=NULL;
create_deck(&headp,&tailp);
printDeck(headp);
}

除此之外,您还可以从此处了解有关链表的更多信息。

这是代码的建议版本

  1. 它干净地编译
  2. 它执行适当的错误检查
  3. 当发生错误时,它不会cleanup,但是,它应该
  4. 它正确地将花色值定义为单个角色
  5. 它更正了add_card()的参数列表
  6. 它记录了每个头文件中使用的内容
  7. 它不会#include头文件,这些内容未被使用
  8. 它将结构定义与关联的typedef分开
  9. 它更正了结构定义
  10. 它删除了不需要的代码
  11. 它正确生成链表
  12. 它正确生成循环链表
  13. 它正确地将尾部指针设置为指向链表中的最后一个条目
  14. 它使用for()语句而不是"笨拙"的while()语句
  15. 它使用有意义的名称而不是硬编码的"魔术"数字
  16. 如果遵循公理:每行只有一个语句,每个语句(最多)一个变量声明。
  17. 它始终缩进代码,在每个左大括号"{"之后缩进。 在每个右大括号"}"之前取消缩进。
  18. 它分隔代码块(for,if,else,while,do.。而,切换,大小写,默认值)通过单个空行。
  19. 它用 2 个空行分隔函数等。

现在的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>    // perror()
#include <stdlib.h>   // malloc(), exit(), EXIT_FAILURE
//#include <math.h>
#define MAX_SUITS 4
#define MAX_CARDS_IN_SUIT 13
#define SPADE 0x06
#define CLUB 0x05
#define DIAMONDS 0x04
#define HEART 0x03
struct node
{
int face_val;
char suit;
struct node * next;
};
typedef struct node card;

// prototypes
void add_card(card **headp, card **tailp, int face, char suit);
void create_deck(card **headp, card **tailp);

void add_card(card **headp, card **tailp, int face, char suit)
{
card *temp = malloc(sizeof(card));
if( !temp )
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
// implied else, malloc successful
temp->face_val = face;
temp->suit = suit;
temp->next = *headp;
if (*headp == NULL)
{
*headp = temp;
*tailp = temp;
}
else
{
(*tailp)->next = temp;
*tailp = temp;
}
} // end function: add_card

void create_deck(card **headp, card **tailp)
{
for ( int i=1; i <= MAX_CARDS_IN_SUIT; i++ )
{
for( int j=1; j <= MAX_SUITS; j++ )
{
switch( j )
{
case 1:
add_card(headp,tailp,i,SPADE);
break;
case 2:
add_card(headp,tailp,i,HEART);
break;
case 3:
add_card(headp,tailp,i,DIAMONDS);
break;
case 4:
add_card(headp,tailp,i,CLUB);
break;
} // end switch
} // end for each suit
} // end for each card in suit
} // end function: create_deck

int main(void)
{
card *headp=NULL;
card *tailp=NULL;
create_deck(&headp,&tailp);
} // end function: main

最新更新