2016-10-07 1 views
1

J'ai eu des problèmes pour programmer une liste doublement chaînée. Le problème est que ma fonction Add aboutit à une boucle infinie quand je vérifie si les liens sont nullptr. Quand je ne le fais pas, cela me donne une erreur. J'ai essayé de régler cela et pour la vie de moi ne peux pas le comprendre. Voici la méthode d'addition:Ajouter une fonction dans une liste doublement liée entraîne une boucle infinie

void Add(string n, int w) //Method to add a node to the Linked List and maintain the order. 
{ 

    node * nd = new node(n, w, nullptr, nullptr); 

    if (nHead == nullptr && wHead == nullptr) //If there is nothing in the Linked List 
    { 
     nHead = nd; //Add a node 
     wHead = nd; 
    } 

    else //If there is something in the linked List 
    { 
     node * ntraverse = nHead; //variable to traverse down the name links 

     while (nd->name > ntraverse->name && ntraverse->wLink != nullptr) 
     { 
      ntraverse = ntraverse->nLink; // Traverses down the name links until nd's name is smaller than a links 
     } 

     nd->nLink = ntraverse; // Here, the namelink for nd is set to ntraverse, since ntraverse is less than or equal to nlink 
     ntraverse->nLink = nd; // So here, since nd is the new value appended to the rest of the list, we set ntraverse = nlink. 

           // note at this point, we have not handled weight 

     node * wtraverse = wHead; //variable to traverse down the weight links 

     while (nd->weight > wtraverse->weight && wtraverse->wLink != nullptr) 
     { 
      wtraverse = wtraverse->wLink; // Traverses down the weight links until nd's weight is smaller than a links 
     } 

     nd->wLink = wtraverse; // Here, the namelink for nd is set to ntraverse, since ntraverse is less than or equal to nlink 
     wtraverse->wLink = nd; // So here, since nd is the new value appended to the rest of the list, we set ntraverse = nlink. 

     //at this point, nd holds both the correct nlink and wlink 

    } 

    cout << "Added: " << nd->name << " " << nd->weight << "\n"; 
    cout << "Current nlist:\n"; 
    nPrint(); 
    cout << "Current wlist:\n"; 
    wPrint(); 

    size++; //increment size 

} 

Toute aide serait grandement appréciée. Si vous avez besoin de moi pour répondre à quelque chose, s'il vous plaît faites le moi savoir. Le nœud fonctionne correctement, il stocke 4 valeurs: nom, poids, nLink et wLink, où nLink conserve la liste ordonnée par nom et wLink conserve la liste ordonnée au poids. Pour LinkedList, nHead est la tête de nom et wHead est la tête de poids.

Encore une fois, merci pour votre aide.

+0

Je suppose que c'est "C" ou "C++"? Veuillez ajouter les tags appropriés. Si oui, ce qui est 'nullptr' –

+0

C++, La raison pour laquelle j'ai ajouté nullptr est que je pensais que quelque chose pourrait mal se passer lors de la vérification des liens pour nullptr. – Paul

Répondre

0

Vous vous mixer wLink et nlink ensemble

node * ntraverse = nHead; //variable to traverse down the name links 

while (nd->name > ntraverse->name && ntraverse->wLink != nullptr) 

Dans ce qui précède, vous traversons les liens de nom et de test pour voir si vous êtes à la fin de la liste de poids.

Ceci n'est pas une liste doublement chaînée, il s'agit de deux listes simples et vous devez traiter chaque liste séparément.

En d'autres termes, votre code devrait ressembler à ceci:

void Add(string n, int w) //Method to add a node to the Linked List and maintain the order. 
{ 

    node * nd = new node(n, w, nullptr, nullptr); 

    if (nHead == nullptr) //If there is nothing in the Linked List 
    { 
     nHead = nd; //Add a node 
    } 


    else //If there is something in the linked List 
    { 
     /* Code to handle nLink with no mention of wLink */ 
    } 

    if (wHead == nullptr) //If there is nothing in the Linked List 
    { 
     wHead = nd; //Add a node 
    } 


    else //If there is something in the linked List 
    { 
     /* Code to handle wLink with no mention of nLink */ 
    } 

} 

Bien sûr, la solution idéale serait d'écrire une classe de liste chaînée ....

+0

Salut, merci pour votre réponse. Tout d'abord, il s'agit d'une méthode dans la classe Linked List. D'abord, quand j'ai changé 'while (nd-> nom> ntraverse-> nom && ntraverse-> wLink! = Nullptr)' à 'while (nd-> nom> ntraverse-> nom && ntraverse-> nLink! = Nullptr)' il en résulte toujours une boucle infinie. Deuxièmement, cette liste est doublement liée. Node a quatre valeurs, Name, Weight, nLink et wLink, où nLink pointe vers le noeud suivant ordonné par name et wLink pointe vers le noeud suivant, en ordre de poids, d'où la raison pour laquelle je ne sépare pas l'instruction if. – Paul

+0

Dans une liste à double liaison, chaque noeud a un pointeur vers le noeud suivant et un pointeur vers le noeud précédent. Cela signifie que ce qui suit est vrai (sauf pour les noeuds de fin): 'n-> Next-> Prev == n' Vous avez une liste de noms liés et une liste de poids unidirectionnelle – Paranoid

+0

La définition d'un noeud doublement lié est simplement qu'il a deux liens. Il ne doit pas nécessairement avoir un lien vers l'avant et un lien de retour, bien que ce soit comment il est conventionnellement utilisé. Dans ce cas, le nœud stocke 2 liens, les deux étant classés par des variables différentes. – Paul

0

Alors je me suis ce que le problème était. À la fin de chaque boucle, j'avais

nd->wLink = wtraverse; // Here, the namelink for nd is set to ntraverse, since ntraverse is less than or equal to nlink 
    wtraverse->wLink = nd; // So here, since nd is the new value appended to the rest of the list, we set ntraverse = nlink. 

Cela créait une boucle circulaire. Le lien de nd stocke wtraverse, et le lien de wtraverse est stocké nd, ce qui signifie que l'un des liens pointe vers une autre partie de la liste. En ce qui concerne l'argument sémantique sur la terminologie de la liste à liaison double, mon professeur en structures de données fait référence à une structure de données dans laquelle le nœud a deux liens sous la forme d'une liste à double liaison. Qu'elle soit correcte ou non, argumenter sémantique était de peu d'aide et n'a rien fait pour résoudre le problème.