正在从链表中删除 select 个节点
Deleting select nodes from linked list
我浏览了一些解释双向链表中节点删除的文章,但我无法理解为什么以下代码不起作用。请提出一些解决方案。
我有两个结构 A 和 B。有一个结构 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;
}
}
但是当我遍历AList和相应的BList时,明显删除的节点仍然存在,导致应用程序崩溃。
请分享一些建议。
您忘记将 AList->bList 设置为列表的新头部。
在释放temp
指向的内容的同时,还需要确保指针AList->bList指向列表中的下一项。由于您不更新它,它会一直指向现在的 free()d BList 项并呈现未指定的结果。
在 AList = AList->next;
之前将 AList->bList
设置为 BList
您没有在 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;
}
}
我浏览了一些解释双向链表中节点删除的文章,但我无法理解为什么以下代码不起作用。请提出一些解决方案。
我有两个结构 A 和 B。有一个结构 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;
}
}
但是当我遍历AList和相应的BList时,明显删除的节点仍然存在,导致应用程序崩溃。 请分享一些建议。
您忘记将 AList->bList 设置为列表的新头部。
在释放temp
指向的内容的同时,还需要确保指针AList->bList指向列表中的下一项。由于您不更新它,它会一直指向现在的 free()d BList 项并呈现未指定的结果。
在 AList = AList->next;
AList->bList
设置为 BList
您没有在 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;
}
}