C语言 从链表中删除选中的节点



我阅读了一些解释在双重链表中删除节点的文章,但是我不能理解为什么下面的代码不能工作。请提出一些解决方案。

我有两个结构体A和B。有一个结构体A的链表,每个结构体A都包含一个B的双链表。我试图从每个A中删除Id小于值的所有B结构体。我是这样做的。

typedef struct __B {
    int id;
    struct __B *next;
    struct __B *prev;
} B;
typedef struct __A {
    B *bList;
    struct __A *next;
} A;
void DeleteNodes(int value, A* AList) {
    while(AList != NULL) {
        B *BList = AList->bList;
        while(BList != NULL) {
            B *temp = BList;
            BList = BList->next;
            if(temp->id < value) {
                if(temp->prev == NULL) // delete first node
                    BList->prev = NULL;
                else {
                    temp->prev->next = BList;
                    temp->next->prev = temp->prev;
                }
                temp->next = NULL;
                temp->prev = NULL;
                free(temp);
                temp = NULL;
            }
        }
        AList = AList->next;
    }
}

但是当我遍历list和相应的BLists时,显然已删除的节点仍然存在,这导致应用程序崩溃。

您没有在while循环中更新AList->bList,这就是为什么它一直指向已删除的项。更改代码以更新AList->blist

void DeleteNodes(int value, A* AList) {
    while(AList != NULL) {
        B *BList = AList->bList;
        while(BList != NULL) {
            B *temp = BList;
            BList = BList->next;
            if(temp->id < value) {
                if(temp->prev == NULL) // delete first node
                    BList->prev = NULL;
                else {
                    temp->prev->next = BList;
                    temp->next->prev = temp->prev;
                }
                temp->next = NULL;
                temp->prev = NULL;
                free(temp);
                temp = NULL;
            }
        }
        AList->bList = BList;
        AList = AList->next;
    }
}

您忘记将list ->bList设置为列表的新头部。

当你free()由temp指向的内容时,你还需要确保指针list ->bList指向列表中的下一个项目。由于不更新它,它会一直指向现在空闲的()d BList项,并呈现未指定的结果。

AList = AList->next;之前设置AList->bListBList

相关内容

  • 没有找到相关文章