gpt4 book ai didi

c - 无法删除双链表中的节点

转载 作者:太空宇宙 更新时间:2023-11-04 06:27:14 26 4
gpt4 key购买 nike

我在没有头/开始指针的情况下进行尝试,该指针通常保存第一个节点的地址。我这里有 3 个节点,我试图从中删除最后一个节点,但它没有发生。我的逻辑可能有误,这是我的第一个链表程序,所以请帮助我!

#include <stdio.h>
#include <stdlib.h>

struct dll {
struct dll* prev;
int data;
struct dll* next;
};

int main() {
struct dll* p1, *p2, *p3, *temp;
p1 = malloc(sizeof(struct dll));
p2 = malloc(sizeof(struct dll));
p3 = malloc(sizeof(struct dll));
temp = malloc(sizeof(struct dll));
p1->prev = NULL;
p1->data = 1;
p1->next = p2;
p2->prev = p1;
p2->data = 2;
p2->next = p3;
p3->prev = p2;
p3->data = 3;
p3->next = NULL;
struct dll* add = NULL;
int count = 0;
printf("add of p1::%p add of p2::%p add of p3::%p add of p1->prev::%p add "
"of p1->next::%p add of p2->prev::%p add of p2->next::%p add of "
"p3->prev::%p add of p3->next::%p\n",
p1, p2, p3, p1->prev, p1->next, p2->prev, p2->next, p3->prev,
p3->next);
while (p1->next != NULL) {
count++;
p1 = p1->next;
}
printf("no of nodes %d\n", count + 1);
puts("enter the addresss of node to delete it");
scanf("%p", &add);
while (p1->next != NULL) {
if (p1->next == add) {
temp = p1->next;
p1->next = NULL;
free(temp);
temp = NULL;
} else
p1 = p1->next;
}
puts("after deletion attempted");
printf("add of p1::%p add of p2::%p add of p3::%p add of p1->prev::%p add "
"of p1->next::%p add of p2->prev::%p add of p2->next::%p add of "
"p3->prev::%p add of p3->next::%p\n",
p1, p2, p3, p1->prev, p1->next, p2->prev, p2->next, p3->prev,
p3->next);

while (p1->next != NULL) {
count++;
p1 = p1->next;
}
printf("no of nodes %d\n", count + 1);
free(p1);
p1 = NULL;
free(p2);
p2 = NULL;
free(p3);
p3 = NULL;
return 0;
}

输出::::

add of p1::0x9605008 add of p2::0x9605018 add of p3::0x9605028 add of p1->prev::(nil) add of p1->next::0x9605018 add of p2->prev::0x9605008 add of p2->next::0x9605028 add of p3->prev::0x9605018 add of p3->next::(nil)

no of nodes 3

enter the addresss of node to delete it
0x9605028

after deletion attempted

add of p1::0x9605028 add of p2::0x9605018 add of p3::0x9605028 add of p1->prev::0x9605018 add of p1->next::(nil) add of p2->prev::0x9605008 add of p2->next::0x9605028 add of p3->prev::0x9605018 add of p3->next::(nil)

no of nodes 3

在这个例子中,我试图通过删除其地址 0x9605028 来删除节点 3,即 p3。但是删除后节点数仍然是 3,地址就像意外一样!

最佳答案

在这个循环之后

while(p1->next!=NULL)
{
count++;
p1=p1->next;
}

p1->next 等于 NULL。现在 p1 指向与 p3 相同的节点。所以你有内存泄漏。

因为 p1->next 等于 NULL 那么这个循环

while(p1->next!=NULL)
{
if(p1->next==add)
{
temp = p1->next;
p1->next=NULL;
free(temp);
temp=NULL;
}
else
p1=p1->next;
}

永远不会迭代。

也不需要为指针temp分配内存

temp=malloc(sizeof(struct dll));

如果你想计算节点的数量,那么代码可以如下所示

int count = 0;

for ( temp = p1; temp != NULL; temp = temp->next ) ++count;

关于c - 无法删除双链表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com