2010-12-09 32 views
2

Lié à mon précédent message Editing a node in a Linked list. Je l'ai fait les étapes dans l'édition suivant le nœud:Modification d'un nœud dans une liste liée Partie 2

  1. Modifier les données de noeud cible
  2. Supprimer noeud cible
  3. noeud cible Réinsérer

LE PROBLÈME EST QUE JE NE PEUX PAS REMPLACER LES INSERT IT eN HAUT dE LA NODE comme suit ....

std1 90 -> std 2 50 -> std3 20 -> NULL 

Je STD3 à 100. edited Le résultat sera comme celui-ci

std2 50 -> std3 20 -> NULL 

En résumé, je ne peux pas le remettre sur le nœud supérieur. Réinsérer n'importe où autre que le nœud supérieur fonctionne bien.

+1

Qu'est-ce qui ne fonctionne pas? Inséré au mauvais endroit, pas inséré, d'autres entrées vont manquer, faute de segmentation, ...? –

+0

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- –

+0

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

Répondre

1

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; 
+0

@James B ... je ne peux pas insérer de nouveau à la liste ce que j'ai enlevé de la liste ... – newbie

+0

quels sont les noms/grades dans la liste, et quelle note changez-vous? Et à quelle valeur le changez-vous? Voir les modifications ci-dessus, j'ai repéré un autre problème. –

+0

Aussi, quelle est l'erreur que vous recevez? –