next 一般用在什么情况?这个语句就是在链表删除中出现的if(p1==head)next;else

发布时间:2021-02-26 05:41:57

next 一般用在什么情况?这个语句就是在链表删除中出现的if(p1==head)next;else {next;//这是什么意思?free(p1);}我就是不太明白这个语句是怎么实现链表的删除的,为什么不直接用p2=p1呢?

网友回答

我大概看懂你的意思了.
head是头指针,p1是指向第一个结点的指针,p2是指向p1前一个结点的指针.如果你给出的程序的是这个意思的话,那下面我就可以解释了.
首先对单向链表的删除要考虑以下4种情况:
1.链表本身是空的
2.删除的是链表的首结点
3.删除的是链表的中间结点或是链表的尾结点
4.要删除的结点在原链表中找不到
(每个结点包含两个部分:数据和指向下一个结点的指针)
if(p1==head)
//首先要明白p1是待删除的结点,如果要删除的结点是首结点//head=head->next;//将首结点中指向下一结点的指针重新赋给head,这样首结点就脱离原链表了//
else {p2->next=p1->next;//这是什么意思?
free(p1);
(回答:这句话是用来删除结点在链表的中部或尾部的情况的.p1是要删除的结点,p2是要删除的结点p1的前一个结点,p1->next存储的是下一个
结点(p1+1)地址.将结点p1中的成员p1.next内存储的地址赋给p2->next这样也就相当于使得p2结点中的p2->next成员存放的也是(p1+1)结点的
地址,这样p2就能指向链表中(p1+1)结点了,也就是相当于p1结点脱离了
链表,所以我们可以说p1结点被删除了)
}提问:为什么不直接用p2=p1呢?
回答:这样是做不到删除某个结点的.因为p1,p2都是结构体类型指针,p1,p2分别指向不同结点的地址,一旦执行p2=p1,是可以将p1结点中的p1.next成员存储的地址赋给p2,但是,这样做的同时,也会把p1所指向的结点的所有数据(包括指向下一个结点的地址)也同时赋给了p2指向的结点.这样就会使得p2原先指向的结点的数据就会被覆盖掉.直接用p2=p1就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的.
以上问题属网友观点,不代表本站立场,仅供参考!