为什么这种删除双向链表中重复元素的方法不起作用?

问题描述 投票:0回答:1

我尝试使用此逻辑删除双向链表中的重复元素 我将创建一个临时指针,该指针将遍历 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)

c data-structures linked-list
1个回答
0
投票

在内部 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
再次访问它。这会调用未定义的行为

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