嘿请别人清除我的疑问,如果我删除了一个节点,后来我尝试打印该节点的数据应该是什么输出?如何检查节点是否被删除?如何检查节点是否被删除或没有在链表中
在这个程序中,我试图删除重复节点以及如何知道我是否正确删除它们!如果我试图访问删除节点的数据,我想在删除节点后,如果一切正常,我会得到零!但是这里就是这种情况,所以我试着重新计算节点,这很好。数数是检查的唯一方法吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct dll {
int data;
struct dll* next;
} dll;
int main() {
dll* p1, *p2, *p3, *p4, *p5, *temp, *head, *todel, *cur, *fwd, *dup;
int count = 0, i = 0, j = 0;
p1 = (dll*)malloc(sizeof(dll));
p2 = (dll*)malloc(sizeof(dll));
p3 = (dll*)malloc(sizeof(dll));
p4 = (dll*)malloc(sizeof(dll));
p5 = (dll*)malloc(sizeof(dll));
p1->data = 1;
p1->next = p2;
p2->data = 2;
p2->next = p3;
p3->data = 3;
p3->next = p4;
p4->data = 2;
p4->next = p5;
p5->data = 1;
p5->next = NULL;
head = p1;
printf("p1::%p\n", p1);
printf("p2::%p\n", p2);
printf("p3::%p\n", p3);
printf("p4::%p\n", p4);
printf("p5::%p\n", p5);
printf("head::%p\n", head);
for (temp = head; temp != NULL; temp = temp->next) {
count++;
}
printf("no of nodes %d\n", count);
temp = head;
cur = temp;
while (cur) {
for (fwd = cur->next; fwd != NULL; fwd = fwd->next) {
if (cur->data == fwd->data) {
cur->next = fwd->next;
// fwd->next=fwd->next->next;
todel = fwd;
free(todel);
fwd = cur;
}
}
cur = cur->next;
}
printf("p1::%p\n", p1);
printf("p2::%p\n", p2);
printf("p3::%p\n", p3);
printf("p4::%p\n", p4);
printf("p5::%p\n", p5);
printf("p1->data::%d\n", p1->data);
printf("p2 data::%d\n", p2->data);
printf("p3->data::%d\n", p3->data);
printf("p4->data::%d\n", p4->data);
printf("p5->data::%d\n", p5->data);
return 0;
}
输出:
p1::0x8728008
p2::0x8728018
p3::0x8728028
p4::0x8728038
p5::0x8728048
head::0x8728008
no of nodes 5
temp::0x8728008
cur::0x8728008
no of nodes 1
p1::0x8728008
p2::0x8728018
p3::0x8728028
p4::0x8728038
p5::0x8728048
p1->data::1
p2 data::2
p3->data::3
p4->data::2
p5->data::0
通过观察输出(无节点:1)我知道节点删除了,但它不是那么清楚,我甚至不知道哪个节点删除了,仍然p2
到p4
给出相同的旧数据值,我怎么知道?
我想你已经删除了某些code.I没有看到将输出 **临时:: 0x8728008 CUR :: 0x8728008没有节点的1 ** – 2014-09-04 17:39:46
假设你复制任何printf语句去除*工作*,你解引用不确定的指针(前p5和p4)。一旦它们指向'free()'d,它们的值(与删除之前存储在链接列表中的相同地址)变得不确定。解除它们引用*未定义的行为*。尝试打印实际的*列表*(提示:编写一个函数,打印一个链接列表给出'head',然后在你的去除算法之前和之后运行它。 – WhozCraig 2014-09-04 17:45:26
一般来说(没有代理你的代码),当你删除一个节点(并且不要立即处理它)时,该节点可能会继续包含到相邻节点的链接,因此不能用于确定节点是否确实在名单。否则,链接列表* deleteNode *代码必须明确地清除已删除节点中的下一个/前一个指针。 – 2014-09-04 17:47:24