我一直在尝试在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;
}
}
}
答案 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指针异常,而不是随机地“起作用”或崩溃。