2010-12-09 4 views
2

Добрый день!Связанный список - Ошибка

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

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

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

какая ошибка вы получаете? – yurib 2010-12-09 12:28:48

+1

... и ваш цикл while в add_student возвращает значение в самой первой итерации – yurib 2010-12-09 12:33:31

+0

«Он закрывает программу без какого-либо сообщения об ошибке» - если ваша программа работает, она будет читать вход, а затем выйти без какого-либо сообщения. – 2010-12-09 12:36:18

ответ

3

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

  • получает может перехватить буфер, если вы вводите слишком много символов ввода для имени.
  • , как YuriB говорит, цикл в add_student всегда возвращается на первые попытки
  • вы не проверить отдачу от malloc, но это не будет проблемой.
  • Вы не указали вперед функции, которые вы вызываете.
  • Вы не включили <stdlib.h> (для malloc) или <stdio.h> (для печатиf).
3
NODE *head, *std; 
head = null; 
std = null  
std = new_student(); 
head = add_student(head, std); 

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

if (head == NULL) return to_add; 

на add_student, голова containts значение мусора.

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

Сначала все ошибки делает, забыл инициализировать ВАР:

NODE *head=NULL, *std=NULL; 
3

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

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

2

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

1209.c:18:10: warning: 'head' is used uninitialized in this function 
Смежные вопросы