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

问题描述 投票:-4回答:1

我一直在尝试在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;
        }
    }
}
c++
1个回答
0
投票

首先:请学习使用调试器。知道它崩溃的确切行并在运行时查看变量和指针,并逐步执行代码将使您免于问这些:“我写了一些代码,它已经破坏了,请修复它。” “问题”。如果gdb对你不实用,请使用visual studio或其他东西。

正如一些程序员家伙建议的那样:learn how to debug your code

关于你的实际问题:

内循环后。

ptr1->next = ptr1->next->next;

没有检查qazxsw poi。访问qazxsw poi将导致访问冲突。

当该检查处于外部while循环条件时,内部while循环可以删除和取消链接列表中的对象。

我也很确定你想在外循环的某个地方重置你的if (ptr1->next == NULL),可能就在开始时。就像现在一样,它不计算任何一个ptr1->next->next的出现次数

你也应该在声明中初始化变量,它只是好的风格,可以避免进一步的麻烦。删除后将指针设置为NULL也是一个好主意,所以你要得到一个漂亮的空指针异常,而不是它随机“工作”或崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.