C语言小问题:p2->next=p1->next 这个语句是什么意思,一般用在什么情况???请大家教教我,谢谢了

这个语句就是在链表删除中出现的
if(p1==head)
head=head->next;
else
{
p2->next=p1->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就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-07
是p2这个结构体指针中所指向的next成员等于p1的所指向的next,一般用在链表中,特别是往链表中增删成员等。。。
第2个回答  2011-03-07
这是链表里边的,->next 是指这个指针所指的节点的下一个节点
第3个回答  2011-03-07
p2结点的后继为p1结点的后继
即p2、p1指向同一个结点
插入一个新的结点在p1后面的话
会:p2->next=p1->next ;
p1->next=p2;
第4个回答  2011-03-07
一般用于链表删除操作
参考:
http://book.51cto.com/art/201003/189239.htm