如何从重复两次的链表中删除重复项?

时间:2019-03-04 13:33:16

标签: c++

我一直在尝试在C ++上创建自己的链接列表类。我的任务是删除列表中数据重复两倍的所有节点,如果数据重复奇数次,则仅存储一个节点。我已经编写了函数removeDuplicates(),但是当我尝试使用该函数时,程序崩溃。在这里实现:

void LinkedList::removeDuplicates(){
    Node *ptr1, *ptr2, *dup, *toDel;
    int counter = 1;
    ptr1 = top;
    while(ptr1 != NULL && ptr1->next != NULL){
        ptr2 = ptr1;
        while(ptr2->next != NULL){
            if(ptr1->name == ptr2->next->name){
                dup = ptr2->next;
                ptr2->next = ptr2->next->next;
                delete dup;
                counter++;
            } else {
               ptr2 = ptr2->next;
            }
        }
        if(counter % 2 == 0){
            toDel = ptr1;
            ptr1->next = ptr1->next->next;
            ptr1 = ptr1->next;
            delete toDel;
        }else{
            ptr1 = ptr1->next;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先:请学习使用调试器。知道崩溃的确切行,并在运行时查看变量和指针,然后逐步执行代码,可以避免您提出以下问题:“我写了一些代码,它坏了,请修复。” “问题”。 如果gdb对您不方便,请使用Visual Studio或其他工具。

正如某些程序员伙计所建议的:learn how to debug your code

关于您的实际问题:

内循环之后。

ptr1->next = ptr1->next->next;
未选中

if (ptr1->next == NULL)。因此,访问ptr1->next->next将导致访问冲突。

当检查处于外部while循环条件中时,内部while循环可能会删除该对象并将其从列表中取消链接。

我也很确定您想在外部循环中的某个位置重置counter,可能就在一开始。现在,它不计算任何ptr2->name

的出现次数

另外,您应该在声明中直接初始化变量,这只是一种好的样式,可以避免进一步的麻烦。 在删除后将指针设置为NULL也是一个好主意,因此您确实会得到一个不错的null指针异常,而不是随机地“起作用”或崩溃。