2016-10-07 16 views
1

二重リンクリストのプログラミングに問題があります。問題は、リンクがnullptrであるかどうかをチェックすると、Add関数が無限ループになることです。私がしなければ、それは私に誤りを与える。私はこれを修正しようとしてきましたが、私の人生はそれを理解できません。以下にaddメソッドを示します。二重リンクリストに関数を追加すると無限ループになります

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 

} 

ご協力いただければ幸いです。私に何かに答える必要があるなら、私に知らせてください。ノードは正常に動作し、name、weight、nLink、およびwLinkの4つの値を格納します。ここで、nLinkはリストを名前順に保ち、wLinkはリストをウェイト順に保ちます。 LinkedListの場合、nHeadは名前の頭で、wHeadは重みの頭です。

もう一度、ご協力いただきありがとうございます。

+0

これは "C"または "C++"と仮定していますか?適切なタグを追加してください。もしそうなら、 'nullptr'とは何か –

+0

C++、なぜnullptrを追加したのかは、nullptrのリンクをチェックするときに何かが間違っているかもしれないと思ったことです。 – Paul

答えて

0

あなたが名前のリンクを横断し、あなたは体重リストの末尾にあるかどうかを確認するためにテストしている上記で

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

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

一緒にあなたのwLinkとnLinkを混合しています。

これは二重リンクされたリストではなく、単独でリンクされた2つのリストであり、各リストを別々に扱う必要があります。

言い換えれば、あなたのコードは次のようになります。もちろん

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 */ 
    } 

} 

を、理想的なソリューションは、リンクリストクラスを記述することです....

+0

お元気です、あなたの答えに感謝します。まず第一に、これはLinked Listクラス内のメソッドです。最初に、while(nd-> name> ntraverse-> ntraverse-> nLink!= nullptr)を 'while(nd-> name> ntraverse-> ntraverse-> nlink!= nullptr)に変更したときに、それでも無限ループが発生します。第二に、これは二重にリンクされたリストです。ノードにはName、Weight、nLink、およびwLinkの4つの値があり、nLinkは名前で順序付けされた次のノードを指し、wLinkは重みによって順序付けられた次のノードを指します。 – Paul

+0

二重リンクされたリストでは、各ノードは次のノードへのポインタと前のノードへのポインタを持ちます。 'n> Next> Prev == n'あなたは単一のリンクされた名前のリストと単一のリンクされた重みのリストを持っています – Paranoid

+0

二重リンクされたノードの定義それには2つのリンクがあります。従来の方法ではありますが、必ずしも順方向リンクと後側リンクを持つ必要はありません。この場合、ノードは2つのリンクを格納し、両方とも異なる変数によって順序付けられる。 – Paul

0

だから私は何を考え出しました問題はなかった。各ループの最後に、私は持っていた

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. 

これは循環ループを作成していました。 ndのリンクはwtraverseに格納され、wtraverseのリンクにはndが格納されます。これはリンクの1つがリストの別の部分を指すことを意味します。

二重リンクリストの用語に関する意味論的議論に関して、私のデータ構造の教授は、ノードが2つのリンクを二重リンクリストとして持つデータ構造を参照しています。それが正しかったかどうかにかかわらず、議論の意味はほとんど役に立たず、問題を解決するために何もしなかった。

関連する問題