链接列表 - 错误

时间:2010-12-09 12:27:14

标签: c linked-list

美好的一天!

我们的老师要求我们使用链表制作学生列表。他的条件是将新的学生信息添加到列表中,以便按照学生的降级顺序对其进行排序。每次运行程序时都会发生错误。我的代码如下。我是在正确的道路上还是我错过了重要的事情?是什么导致错误?您的回复将受到高度赞赏。先感谢您。

typedef struct student{
       char name[11];
       unsigned int grade;
       struct student* next;       
    }NODE;

int main (void){
    NODE *head, *std;
    std = new_student();
}

5 个答案:

答案 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,但还有其他一些问题:

    如果输入的名称输入字符太多,
  • 可以溢出缓冲区。
  • 正如yurib所说,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