我正在尝试编写一个程序,用一个链表创建一副卡片。我的插入功能需要将输入的卡号及其套装添加到列表的末尾。我创建的代码已经给了我一个分段错误。
#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);
}
}
}
答案 0 :(得分:1)
while(temp->next)
{
temp=temp->next;
temp->next=newnode;
}
是一个无限循环,除非传入的指针有s->next == NULL
。在第一次迭代中,temp is moved to
s-&gt; next , then its
next pointer is set to point to
newnode , so it's not
NULL . Then
temp移至newnode
及其{{} 1}}指针设置为next
- 本身,oops。
您需要在循环外移动newnode
的分配
newnode
并初步构建while(temp->next)
{
temp=temp->next;
}
temp->next=newnode;
。
当你打电话
newnode->next = NULL;
在insert(head, su,num);
中,main
是一个未初始化的指针,因此您正在调用未定义的行为。
答案 1 :(得分:0)
在insert()temp->next=newnode;
中应该在while循环之外。
还应指定newnode->next = NULL;
另外*头部是未初始化的,最后?你应该分配更多的内存 到字符串而不是一个字符(+可能的填充)。
否:char x, su, num; scanf("%s",&su);
是的:const int MAX=100; char x[MAX], su[MAX], num[MAX]; scanf("%s",su);
答案 2 :(得分: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
访问head变量的地址并在该变量中设置一个值。当列表为空时,这将完成。在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;