我正在尝试这个没有头/开始指针,它通常会保存第一个节点的地址。我在这里有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,地址就像意外!
答案 0 :(得分:2)
此循环后
while(p1->next!=NULL)
{
count++;
p1=p1->next;
}
p1-&gt; next等于NULL。现在p1指向与p3相同的节点。所以你有内存泄漏。
当p1-&gt; 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;
答案 1 :(得分:1)
您没有重新初始化您的变量。
在第一次&#34;计数&#34; trip,p1
实际上是指向列表中的第三个元素,并且它永远不会回到开头(事实上,你不会存储循环开头的位置) 。所以从那时起,p1->next!=NULL
就是假的。其他两个循环都没有运行。
请注意在&#34;删除&#34;之后输出p1
的地址。与p3
的相同。您只获得相同的计数,因为在尝试重新计算之前,您从未将count
设置为零。
答案 2 :(得分:1)
您将遇到的另一个问题是,当您最终删除某个节点时,除非您重置下一个和前一个ponters,否则将破坏链接列表。这是关于如何做的一些逻辑。
然后重置您的链接。
(deleteMe-&gt; previous) - &gt; next = deleteMe-&gt; next;
(deleteMe-&gt; next) - &gt; previous = deleteMe-&gt; previous;
现在您可以免费删除deleteMe
但请确保您在步骤2中有一个指向其余节点之一的指针,否则您将在内存泄漏中丢失该列表。