У вас будет проблема, если головной узел равен 97%, а вы пропустите узел с 97%.Вам нужно сказать
while (curr_std != NULL && to_add->grade <= curr_std->grade){
У вас также будет проблема, если студент, которого вы редактируете, является первым узлом, потому что это:
while((cur != NULL) && (strcmp(cur->name,temp) != 0)){
оценит как истинное
prev = cur;
никогда не вызовут, оставив prev
= ноль.Затем, когда вы доберетесь до
prev->next = cur->next;
, у вас будет нулевая ссылка.Вам необходимо явно проверить добавление в головной узел;это его особый случай.
scanf("%d", &(cur->grade));
if (prev == null) { // you matched the head
head = cur->next;
}
else {
prev->next = cur->next;
}
EDIT Когда вы добавляете заголовок в свой код, вы не устанавливаете заголовок так, чтобы он указывал на ваш новый узел.Вы возвращаете старую голову, которая теперь указывает на второй узел в списке.Попробуйте:
while (curr_std != NULL && to_add->grade < curr_std->grade){
prev_std = curr_std;
curr_std = curr_std->next;
}
// if you're adding to the head, you didn't go into the above loop
// curr_std is still pointing to head in this case
if (curr_std == head) {
head = to_add
}
else {
prev_std->next = to_add;
}
to_add->next = curr_std;
return head;