我尝试使用此逻辑删除双向链表中的重复元素 我将创建一个临时指针,该指针将遍历 for 循环下的链表末尾,直到达到 NULL。在这个 for 循环下,我将再次遍历链表直到末尾,以搜索重复的元素。如果我发现该元素重复,我会将其分配给一个名为temporaryStorer的变量,然后在更改链接后,释放temporaryStorer
为什么这会导致线路出错:
(index->leftLink->rightLink)=(index->rightLink);
这是代码
NODE* deleteDuplicates(NODE* head){
NODE* current;
NODE* temporaryStorer;
NODE* index;
if (head==NULL) {
printf("List is empty\n");
return head;
} else {
for (current=head; current!=NULL; current=current->rightLink) {
for (index=current->rightLink; index!=NULL; index=index->rightLink) {
if ((index->info)==(current->info)) {
//Values are equal
//Index is duplicate
temporaryStorer=index;
(index->leftLink->rightLink)=(index->rightLink);
if (index->rightLink!=NULL){
index->rightLink->leftLink=index->leftLink;
free(temporaryStorer);
}
} else {
continue;
}
}
}
}
return head;
}
我的Node是这样定义的
typedef struct NODE {
struct NODE* leftLink;
int info;
struct NODE* rightLink;
}NODE;
我获得的错误是线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x10)
在内部 for 循环中,你有
for (index=current->rightLink; index!=NULL; index=index->rightLink) {
if ((index->info)==(current->info)) {
...
temporaryStorer=index;
...
if (index->rightLink!=NULL){
...
free(temporaryStorer);
}
}
}
因此,由于
temporaryStorer
指向与 index
相同的内存(因此在代码片段中没有任何用途),实际上您调用 free(index)
,然后通过 index=index->rightLink
再次访问它。这会调用未定义的行为