リンクされたアイテムのリストを取得し、すべての繰り返しをリストから削除する関数があります。何らかの理由で、関数内でリンクリストを実行すると、繰り返し項目のうちの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つは削除されていませんか?
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
@πάνταῥεῖ私はそれが間違っている理由、特に私のnoRepeat機能を理解したいと思います。何か目立ったエラーはありますか?それとも、私はそれを正しく実装したように見えますか? – user2896120
少なくともあなたのlist_remove()関数を表示すれば、実装全体を見ることができないときに、あなたが何をしているのかわからなくても結構です。 –