Связанный список - ошибка - PullRequest
       1

Связанный список - ошибка

2 голосов
/ 09 декабря 2010

Добрый день!

Наш учитель попросил нас составить список студентов, используя связанный список.Его условие заключается в добавлении новой информации о ученике в список таким образом, чтобы она сортировалась в соответствии с оценками ученика в порядке убывания.Ошибка возникает каждый раз, когда я запускаю программу.Мой код выглядит следующим образом.Я на правильном пути или я упускаю что-то важное?Что вызывает ошибку?Ваш ответ будет высоко оценен.Заранее спасибо.

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

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

Ответы [ 5 ]

3 голосов
/ 09 декабря 2010

Я думаю, что ошибка, вероятно, в том, что вы не инициализируете head в NULL в main перед передачей его в add_student, но есть и другие проблемы:

  • может получитьпереполнить буфер, если вы введете слишком много символов ввода для имени.
  • , как говорит юриб, цикл в add_student всегда возвращается с первой попытки
  • вы не проверяете возвратиз malloc, но это , а не . Это будет проблемой.
  • вы не объявили функции, которые вы вызывали, форвард-вперёд.
  • вы не включили <stdlib.h> (для malloc) или <stdio.h> (для printf).
3 голосов
/ 09 декабря 2010

return в цикле while выглядит очень подозрительно, так как это означает, что код после цикла никогда не будет достигнут.

Также опасно использовать обычный gets() в 11-символьноммассив;очень легко получить переполнение.Используйте fgets().

3 голосов
/ 09 декабря 2010
NODE *head, *std;
head = null;
std = null    
std = new_student();
head = add_student(head, std);   

Попробуй это. Вы не инициализируете голову, а когда

if (head == NULL) return to_add;

в add_student, head содержит значение мусора.

Edit1: Также имейте в виду

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 таким образом.

2 голосов
/ 09 декабря 2010

Компилятор должен сообщить вам о некоторых ошибках, прежде чем мы это сделаем.Это важное предупреждение, которое gcc дал мне:

1209.c:18:10: warning: 'head' is used uninitialized in this function
2 голосов
/ 09 декабря 2010

Первая ошибка, которую все делают, забыл инициализировать переменную:

NODE *head=NULL, *std=NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...