2016-09-18 8 views
-3

リンクされたアイテムのリストを取得し、すべての繰り返しをリストから削除する関数があります。何らかの理由で、関数内でリンクリストを実行すると、繰り返し項目のうちの1つだけが削除されます。リンクリストの繰り返しを削除する

ここに私のコードです:

#include "node1.h"; 
#include <iostream> 

using namespace std; 
using namespace main_savitch_5; 

void noRepeat(node* head_ptr){ 
    for (node* i = head_ptr; i != NULL; i = i->link()){ 
     for (node* j = i->link(); j != NULL; j = j->link()){ 

      if (i->data() == j->data()){ 
       list_remove(j); 
      } 
     } 
    } 
} 

void list_print(node * head_ptr){ 
    //Start at the head pointer and loop through the linked list 
    for (node* i = head_ptr; i != NULL; i = i->link()){ 
     //Print out current element 
     cout<<i->data()<<" "; 
    } 
    //New line 
    cout<<""<<endl; 
} 

int main(){ 
    node* one = new node(5); 
    node* two = new node(3, one); 
    node* three = new node(5, two); 
    node* four = new node(6, three); 
    node* five = new node(3, four); 
    noRepeat(five); 
    list_print(five); 
} 

実装された機能:

//Receives current node data 
value_type data() const { return data_field; } 

//Receives link 
node *link() { return link_field; } 

リストは、私が最初に私のコードを実行すると

void list_remove(node *previous_ptr) { 
     node *remove_ptr; 

     remove_ptr = previous_ptr->link(); 
     previous_ptr->set_link(remove_ptr->link()); 
     delete remove_ptr; 
    } 

機能を削除し、noRepeat機能が取りますヒーで5つのポインタであり、すべての重複を削除しようとします。その後、リストが印刷されます。印刷されたリストは:3 6 5 3ですが、3 6 5でなければなりません、なぜ5が削除されていますが、3つは削除されていませんか?

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

@πάνταῥεῖ私はそれが間違っている理由、特に私のnoRepeat機能を理解したいと思います。何か目立ったエラーはありますか?それとも、私はそれを正しく実装したように見えますか? – user2896120

+2

少なくともあなたのlist_remove()関数を表示すれば、実装全体を見ることができないときに、あなたが何をしているのかわからなくても結構です。 –

答えて

1
内側のループでは

for (node* j = i->link(); j != NULL; j = j->link()){ 

     if (i->data() == j->data()){ 
      list_remove(j); 
     } 

あなたは、これはあなたが(少なくとも、あなたの二重ループの論理に応じて)削除するノードであることを意味し、ノードjと機能list_removeを呼んでいます。

しかし、関数は実際に削除するノードへ先行ノードを取り、ノードを除去します。関数内のロジックからAsidesが、あなたはすでにあなたの例では

void list_remove(node *previous_ptr) { 

でそれを見ることができ、3の次のノードがnullであるので、何も実際には削除されません。

+0

何らかの理由でコードを使用するとプログラムが実行されますが、動作を停止して終了します。それをしている問題は2番目のループです:j-> link()!= NULLとif文の意味は次のとおりです:j-> link() - > data() – user2896120

+0

@ user2896120これは、あなたがコードを実行するのに十分なものではないという点で、 。私は私の提案を消していくつもりですが、あなたの最後の3つを消さない問題は、私が説明したものです。 –