我一直在尝试在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;
}
}
}
首先:请学习使用调试器。知道它崩溃的确切行并在运行时查看变量和指针,并逐步执行代码将使您免于问这些:“我写了一些代码,它已经破坏了,请修复它。” “问题”。如果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也是一个好主意,所以你要得到一个漂亮的空指针异常,而不是它随机“工作”或崩溃。