我有一个函数,它接受一个项链表,并从列表中删除所有重复项。出于某种原因,当我在函数中运行链表时,它只删除其中一个重复项。
这是我的代码:
#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被删除但三者不是?
答案 0 :(得分:1)
在内循环中
for (node* j = i->link(); j != NULL; j = j->link()){
if (i->data() == j->data()){
list_remove(j);
}
您正在使用节点list_remove
调用函数j
,这意味着这是您要删除的节点(至少根据双循环的逻辑)。
但是,该函数实际上将前面的节点带到要删除的节点,并删除 next 节点。除了函数中的逻辑外,您还可以在
中看到它void list_remove(node *previous_ptr) {
在您的示例中,3的下一个节点为null,因此实际上没有删除任何内容。