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