Pop de de liste Liée
J'ai mis en place une Liste Liée à une fonction de bruit dans C:
Node * pop (Node * head) {
Node * temp = head;
printf("Temp is: %s\n", temp->val);
if (head->next != NULL) {
*head = *head->next;
}
printf("Temp is: %s\n", temp->val);
return temp;
}
Et la sortie quand je pop serait quelque chose comme:
Temp is: node1 value
Temp is: node2 value
C'est-à-dire que la temp est de plus en temp->suivant lorsque je attribuer *head = *head->next
.
Alors, comment puis-je obtenir la valeur du courant head
et retourner tout en déplaçant la tête de la liste Liée à head->next
?
Faire head = head->next
ne PAS supprimer la référence vers le premier nœud. (c'est à dire Lorsque j'imprime la liste, le premier nœud est toujours là).
Grâce.
OriginalL'auteur Travv92 | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Vos besoin pour passer l'adresse de
head
pour votre fonction à modifier. Ensuite, votre fonction doit déréférencer cette adresse. De plus, le dernier pop() doit changer *AddressOfHead ainsi...
Test avec soin. Si vous êtes débutant avec un NUL de la tête et en poussant les nœuds, ce ne sera jamais pop le dernier nœud.
pourriez-vous expliquer pourquoi cela pourrait-il arriver? J'ai un code ici que n'apparaissent la pop de la dernière nœuds correctement: ideone.com/tVYck0. (S'il vous plaît ignorer le fait que je n'ai pas libéré de la mémoire allouée)
Quelqu'un a résolu le problème! C'est bien maintenant. Je pense toujours à l'aide du pointeur de pointeur plutôt que d'une véritable liste de tête donne le code fragile.
pour & cons de toute façon. Avoir une Tête de la structure peut être utile. Avoir une tête à la structure, avec une longueur fournit rapide de la longueur de l'évaluation devrait quelque chose de plus que les non-zéro-ness être nécessaire. Aussi utile pour d'autres marqués de l'information. La tête de la structure w/longueur est inutile parce que la liste est NULL et la cohérence devient un problème. Head w/longueur prend 2x espace. Ce n'est pas négligeable lorsqu'il y a peut être une importante majorité de vide listes. BTW: mon fils a été récemment sur la Plaine pour Une Journée.
OriginalL'auteur chux
Tout d'abord, notez que votre code (et certaines des solutions précédentes) ne sera jamais pop le dernier élément de la liste. Vous souhaitez
Prochaine, en passant un pointeur vers un pointeur de travail. Mais c'est effectivement mieux de faire une liste d'en-tête comme ceci:
Maintenant déclarer une liste comme ceci:
Déclarer un tableau de l'un des éléments qui rend chaque référence à
list
un pointeur automatiquement, ce qui élimine beaucoup de&
's dans votre code. Ensuite, c'est beau et propre à mettre en œuvre push et pop:Pourquoi est-ce mieux? Disons que vous décidez plus tard de garder un nombre d'éléments dans la liste. Avec des en-tête de nœud, c'est très facile:
Note pas de code d'appel doit changer. Avec le pointeur de pointeur approche, vous êtes dans une impasse. Il existe de nombreux autres cas d'utilisation où le fait d'avoir une liste séparée tête rend votre code plus souple pour les changements à venir.
OriginalL'auteur Gene
D'autres ont dit comment résoudre le problème, permettez-moi de répondre pourquoi
temp
changé..Vous êtes de passage à
head
comme un pointeur vers unNode
.Ainsi, lorsque vous ne
Je pense que c'est analysée comme
Et donc des COPIES de l'objet qui est à côté de l'objet à
head
, qui est bien sûr le même objet autemp
.OriginalL'auteur Karthik T
Pointeurs sont passés par valeur. C'est, lorsque vous passez un pointeur sur la pile, un changement dans la fonction appelée à ce que le pointeur pointe vers n'est pas reflété dans la fonction appelante.
Pour que la valeur du noeud pointeur à être modifié dans la fonction d'appel, vous devez passer la pile comme un pointeur vers un pointeur:
Vous n'avez pas besoin de vérifier
if ((*head)->next)
ou dans ce casif (temp->next)
avant de mettre à jour la valeur de*head
, parce que si vous êtes sur le dernier nœud de la pile et le noeud suivant estNULL
, vous voulez la liste deNULL
de toute façon.Karthik T réponse est la bonne explication pour pourquoi la valeur de l'
temp
était en train de changer dans votre code original.OriginalL'auteur verbose