我似乎想不通。出于某种原因,我的链表没有创建一副牌,甚至没有创建一个节点。如果有人能帮忙,我将不胜感激。我的所有代码都在下面。如果你能告诉我我做错了什么,并指出我正确的方向,那将非常有帮助。
#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);
}
除此之外,您还可以从此处了解有关链表的更多信息。
这是代码的建议版本
- 它干净地编译
- 它执行适当的错误检查
- 当发生错误时,它不会
cleanup
,但是,它应该 - 它正确地将花色值定义为单个角色
- 它更正了
add_card()
的参数列表 - 它记录了每个头文件中使用的内容
- 它不会
#include
头文件,这些内容未被使用 - 它将结构定义与关联的
typedef
分开 - 它更正了结构定义
- 它删除了不需要的代码
- 它正确生成链表
- 它正确生成循环链表
- 它正确地将尾部指针设置为指向链表中的最后一个条目
- 它使用
for()
语句而不是"笨拙"的while()
语句 - 它使用有意义的名称而不是硬编码的"魔术"数字
- 如果遵循公理:每行只有一个语句,每个语句(最多)一个变量声明。
- 它始终缩进代码,在每个左大括号"{"之后缩进。 在每个右大括号"}"之前取消缩进。
- 它分隔代码块(for,if,else,while,do.。而,切换,大小写,默认值)通过单个空行。
- 它用 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