美好的一天!
我们的老师要求我们使用链表制作学生列表。他的条件是将新的学生信息添加到列表中,以便按照学生的降级顺序对其进行排序。每次运行程序时都会发生错误。我的代码如下。我是在正确的道路上还是我错过了重要的事情?是什么导致错误?您的回复将受到高度赞赏。先感谢您。
typedef struct student{
char name[11];
unsigned int grade;
struct student* next;
}NODE;
int main (void){
NODE *head, *std;
std = new_student();
}
答案 0 :(得分:3)
NODE *head, *std;
head = null;
std = null
std = new_student();
head = add_student(head, std);
试试吧。你没有初始化头,什么时候
if (head == NULL) return to_add;
在add_student上,head包含垃圾值。
编辑1:另请注意
NODE *curr_std, *prev_std = NULL;
不等同于
NODE * curr_std = NULL;
NODE * prev_std = NULL:
如果那是你想要写的,那么你应该:
NODE *curr_std = NULL, *prev_std = NULL;
但你这样做的方式不会影响你的程序。
<强> EDIT2:强>
while (curr_std != NULL && to_add->grade < curr_std->grade){
prev_std = curr_std;
curr_std = curr_std->next;
}
prev_std->next = to_add;
to_add->next = curr_std;
return head;
有点奇怪。回头;不应该真的在那里。你没有那样“刷新”你的LL。
答案 1 :(得分:3)
return
循环中的while
看起来非常可疑,因为这意味着永远无法访问循环后的代码。
此外,将普通gets()
用于11-char数组也很危险;很容易溢出。使用fgets()
。
答案 2 :(得分:3)
我认为该错误可能是您在head
中将main
初始化为NULL,然后再将其传递给add_student
,但还有其他一些问题:
add_student
中的循环总是在第一次尝试时返回malloc
的回报,但是不会成为问题。<stdlib.h>
(适用于malloc)或<stdio.h>
(适用于printf)。答案 3 :(得分:2)
每个人都犯的第一个错误,忘记了init vars:
NODE *head=NULL, *std=NULL;
答案 4 :(得分:2)
编译器应该在我们做之前告诉你一些错误。这是gcc
给我的重要警告:
1209.c:18:10: warning: 'head' is used uninitialized in this function