Vous aurez un problème si le nœud principal est un 97%, et vous passez un nœud avec un 97%. Vous devez dire
while (curr_std != NULL && to_add->grade <= curr_std->grade){
Vous aurez également un problème si l'étudiant que vous modifiez est le premier noeud, car ceci:
while((cur != NULL) && (strcmp(cur->name,temp) != 0)){
évaluera true et
prev = cur;
ne sera jamais appelé, laissant prev
= null. Puis, lorsque vous arrivez à
prev->next = cur->next;
vous avez une référence nulle. Vous devez tester explicitement l'ajout au noeud principal; c'est son propre cas particulier.
scanf("%d", &(cur->grade));
if (prev == null) { // you matched the head
head = cur->next;
}
else {
prev->next = cur->next;
}
EDIT
Lorsque vous ajoutez à la tête, dans votre code, vous avez pas réglé la tête pour pointer vers votre nouveau nœud. Vous retournez l'ancienne tête, qui pointe maintenant vers le deuxième noeud de la liste. Essayez:
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;
Qu'est-ce qui ne fonctionne pas? Inséré au mauvais endroit, pas inséré, d'autres entrées vont manquer, faute de segmentation, ...? –
Pauses si vous insérez un étudiant avec la même note qu'un autre. Votre boucle while dans insert_student ne s'exécute pas et donc l'affectation à prev_std-> next échouera car prev_std est toujours NULL. Une des conditions dans insert_student doit inclure "=" ainsi que moins-que ou plus-que- –
Je pense qu'il y a aussi un problème si le noeud "head" lui-même est en cours d'édition: la suppression du noeud détruit la liste 'n'est pas mis à jour pour pointer sur cur-> next. – Lars