我试图做一个关于链表的例子。首先,我将值添加到变量中并且没有问题。但是当我试图从用户那里获得价值时,程序在进入中期2年级时就崩溃了。我尝试了其他输入函数,但结果是一样的。问题在哪里?
#include <stdio.h>
struct student
{
char *name;
int m1,m2,final;
struct student* next;
};
main()
{
addStudent();
system("PAUSE");
}
addStudent()
{
struct student *node = NULL;
struct student *firstnode;
firstnode = (struct student *)malloc(sizeof(struct student));
node = firstnode;
printf("press 0 to exit \n");
while(1)
{
printf("Student name: ");
scanf("%s", node->name)
if(node->name == "0") break;
printf("Midterm 1: ");
scanf("%d", node->m1);
printf("Midterm 2: ");
scanf("%d", node->m2);
printf("Final: ");
scanf("%d", node->final);
node->next = (struct student *)malloc(sizeof(struct student));
node = node->next;
}
node->next = NULL;
node = firstnode;
while(node->next);
while(node->next != NULL)
{
printf("%s - ",node->name);
printf("%d ", node->m1);
printf("%d ", node->m2);
printf("%d ", node->final);
node = node->next;
}
system("PAUSE");
return 0;
}
答案 0 :(得分:0)
删除行
while(node->next);
原因:在大多数情况下,它会让你无限循环,这是不必要的。
替换循环
while(node->next != NULL) {
}
与
if (node->next != NULL) {
while (node->next->next != NULL) {
}
}
原因:您每次都要分配一个额外的结构,并将其保留为空,以便下次阅读。因此,链接列表将在下一个变为NULL之前结束。
在struct
中替换以下内容char *name;
与
char name[80];
原因:内存未分配。
替换所有scanf
(name
除外)
scanf("%d", node->m1);
与
scanf("%d", &node->m1);
原因: scanf
需要读取数据的内存位置。
答案 1 :(得分:0)
您的代码有多处错误。
首先,第一个scanf("%s", node->name)
缺少终止分号。
接下来,您的功能签名很草率。 main()
应为int main(void)
。 addStudent()
应为int addStudent(void)
。 (或者,摆脱它的return 0
并让它返回void
。)因为你没有预先声明addStudent()
,所以你应该在main()
之前定义它。 main()
可以了解它。
node->name
分配内存。您已为node
分配了内存,但这并没有为您提供放置名称的空间。