2010-07-20 11 views
2

J'ai travaillé avec une liste doublement chaînée. Tout fonctionne bien avec l'exemption de la fonction qui devrait ajouter une copie de 'who' avant 'whereX' [voir code ci-dessous]. Pourquoi la fonction ne fonctionne-t-elle pas?Comment ajouter un noeud dans un emplacement spécifique?

void addNodeAt(Node *whereX, Node *who) 
{ 
    //copy 
    Node *temp = (Node*)malloc(sizeof(Node)); 
    temp->count = who->count; 
    strcpy(temp->word,who->word); 
    temp->before = whereX->before; 
    temp->after = whereX; 

    //paste 
    if(whereX->after == who) 
     whereX->after = who->after; 

    whereX->before = temp; 
} 

EDIT:

En réponse à user326404 qui a dit:

« Note: Votre fonction ne souffre d'un défaut qui empêche d'insérer qui, comme la nouvelle tête de liste. Il va s'insérer, mais vous ne renverrez jamais le nouveau nœud principal, donc la liste est perdue. ' Et si j'ai une tête de nœud * en tant que variable globale,

Comment puis-je redéfinir la tête sans la retourner?

Répondre

2

Vous n'êtes pas laisser les liens existants connaissent le nœud temporaire nouvellement créé. Ajoutez le code suivant à la fin de la fonction pour laisser la partie précédente de la chaîne pointer vers le nœud nouvellement créé.

if (whereX->before != NULL) 
    whereX->before->after = temp; 

Note: Votre fonction ne souffre d'une faille qui l'empêche d'insérer who comme la nouvelle tête de liste. Il va s'insérer, mais vous ne renverrez jamais le nouveau nœud principal de sorte que la liste est perdue.

+0

que se passe-t-il si je ne souhaite pas renvoyer la nouvelle tête et que j'ai une tête de nœud * en tant que variable globale. comment puis-je réparer la faille? –

+0

Avec une variable globale tenant la tête, vous devez libérer() l'ancienne tête et la pointer vers la nouvelle. – Manfre

+0

M ... C'est intéressant. La variable globale 'head' que je viens de pointer sur le premier noeud de la liste et le dernier noeud de la liste donc 'whereX' ou 'who' ne sera jamais en tête. Est un peu comme un pont. –

1

Disons que vous avez cette liste: [Node1] <-> [WhereX] <-> [Node2]

A partir de ces missions:

Node *temp = (Node*)malloc(sizeof(Node)); 
temp->count = who->count; 
strcpy(temp->word,who->word); 
temp->before = whereX->before; 
temp->after = whereX; 

et de ceci:

whereX->before = temp; 

vous aurez:

[Node1] <- [temp] <-> [WhereX] <-> [Node2] 
    |     ^
    ---------------------- 

mais pointeur de Node1 after cherche toujours à oùX, donc vous devez ajouter cette tâche:

whereX->before->after = temp; 
+0

Merci pour votre réponse! –

0

Ce que vous faites a besoin de quelques changements. Vous avez correctement alloué de la mémoire à dupliquer. Mais l'énoncé du problème n'est pas très clair.

En supposant que vous voulez ajouter un nœud avant oùX, vous devez faire ce qui suit:

  1. Point pointeur "after" de température à oùX
  2. Point « avant » pointeur de température pour pointer « before » de oùX
  3. point "before->after" pointeur de oùX à température
  4. point "before" pointeur de oùX à température

Espérons que cela aide.

EDIT:

faire également le contrôle NULL approprié