-1

我正在尝试编写一个程序来创建带有链表的一副卡片。我的插入功能需要将输入的卡号及其花色添加到列表的末尾。我创建的代码已经给了我一个分段错误。

#include <stdio.h>
#include <string.h>

struct node{
    char number;
    char suit;
    struct node *next;
    };

int insert(struct node *s, char su, char num)
{
   struct node *temp=s;
   struct node *newnode=(struct node*)malloc(sizeof(struct node));
   newnode->number=num;
   newnode->suit=su;
   while(temp->next)
   {
      temp=temp->next;
      temp->next=newnode;
   }
   return 0;
}

main()
{
   struct node *head;
   char x;
   while(1)
   {
      printf("What would you like to do?\n");
      printf("Insert: i\n");
      scanf("%s",&x);
      if(x=='i')
      {
         char su, num;
         printf("Please enter the suit\n");
         scanf("%s",&su);
         printf("Please enter the number\n");
         scanf("%s",&num);
         insert(head, su,num);
      }
   }
}
4

3 回答 3

1
while(temp->next)
{
   temp=temp->next;
   temp->next=newnode;
}

是一个无限循环,除非传入的指针有s->next == NULL. 在第一次迭代中,temp is moved tos->next , then itsnext pointer is set to point tonewnode , so it's notNULL . Thentemp 移动到newnode并且它的next指针被设置为newnode-- 它本身,哎呀。

您需要将分配移到newnode循环外,

while(temp->next)
{
   temp=temp->next;
}
temp->next=newnode;

并初始化newnode->next = NULL;施工。

当你打电话时

insert(head, su,num);

in main,head是一个未初始化的指针,因此您正在调用未定义的行为。

于 2012-11-13T19:59:24.983 回答
0

其他答案指出了您的错误,但它们给您留下了如何进入指向您创建的列表的head问题main。有两种方法可以做到这一点。一种是使用双指针,另一种是从insert.

在双指针方法中,insert会有原型

int insert(struct node **s, char su, char num); 

并将使用以下地址调用head

struct node *head = NULL; // initialise to NULL, an empty list
... // get the new values for su/num
insert(&head, su, num);

这允许insert访问头变量的地址并在该变量中设置一个值。这将在列表为空时完成。在insert你做类似的事情:

if (*s == NULL) {
    *s = newnode;
} else {
    // attach to end of list
}

在指针返回方法中,insert会有原型

struct node *insert(struct node *s, char su, char num); 

并将使用以下地址调用head

struct node *head = NULL; // initialise to NULL, an empty list
... // get the new values for su/num
head = insert(head, su, num);

在这个方法中,insert返回一个指向链表头的指针;当列表为空时,它返回 newnode。在insert你做类似的事情:

if (s == NULL) {
    s = newnode;
} else {
    // attach to end of list
}
return s;
于 2012-11-13T20:59:23.653 回答
0

在 insert() temp->next=newnode;中应该在 while 循环之外。
也应该分配newnode->next = NULL;

还 *head 未初始化,最后?您应该为字符串分配比一个字符更多的内存( + 可能的填充)。

否:char x, su, num; scanf("%s",&su);
是:const int MAX=100; char x[MAX], su[MAX], num[MAX]; scanf("%s",su);

于 2012-11-13T19:58:50.027 回答