我大概看懂你的意思了。
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就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的。
删除什么?