C语言小问题:p2->next=p1->next 一般用在什么情况?
首页/题库/240℃/2024-05-17 16:18:13
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就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的.
我来回答修改/报错/举报内容!
猜你喜欢
- 停车场里有20辆小汽车,大汽车的数量是小汽车的五分之三,同时大汽车的数量又是卡车的四分之三,卡车有多少
- Look at this boy.He is( )good friend
- (x-1)(x-2)(x-3)(x-4)=0,求x等于多少,
- 星期天张波道集贸市场买苹果,买每千克3元的苹果用去所带钱的一半,而其余的钱都买了每千克2元的苹果
- 我的女儿很淘气.我很希望她是一个听妈妈话的孩子.
- 新买的玻璃杯,揭掉标签有一层粘胶,怎样能快速清理干净
- 我们都很难过,英文怎么写
- 已知冰的密度为0.9*10的3次方/立方厘米,一块体积是30立方千米的冰化成水后质量和体积分别为多少
- 过氧化氢不稳定会自然分解,久置的过氧化氢溶液,其溶质的质量分数会变小.某兴趣小组为测定实验室中一瓶久置的过氧化氢溶液中溶
- 下面人名各取什么成语.
- 求 那一刻,我流泪 欢笑 的作文,
- 世界上的生物有多少种?