C语言小问题:p2->next=p1->next 一般用在什么情况?
来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/08/17 02:56:57
C语言小问题:p2->next=p1->next 一般用在什么情况?
这个语句就是在链表删除中出现的
if(p1==head)
head=head->next;
else
{
p2->next=p1->next;//这是什么意思?
free(p1);
}
我就是不太明白这个语句是怎么实现链表的删除的,为什么不直接用p2=p1呢?
这个语句就是在链表删除中出现的
if(p1==head)
head=head->next;
else
{
p2->next=p1->next;//这是什么意思?
free(p1);
}
我就是不太明白这个语句是怎么实现链表的删除的,为什么不直接用p2=p1呢?
![C语言小问题:p2->next=p1->next 一般用在什么情况?](/uploads/image/z/2046893-5-3.jpg?t=C%E8%AF%AD%E8%A8%80%E5%B0%8F%E9%97%AE%E9%A2%98%3Ap2-%3Enext%3Dp1-%3Enext+%E4%B8%80%E8%88%AC%E7%94%A8%E5%9C%A8%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%3F)
我大概看懂你的意思了.
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就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的.
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就等于删除结点的同时又改变了原链表结点的数据,所以这样做是不合理的.
C语言小问题:p2->next=p1->next 一般用在什么情况?
C语言p2->front->next=p1表示什么
关于c语言链表的一个问题h->next=p1,p2->next=p1是什么意思,又有什么作用
p2->next=p1;p2=p1;
C++p1->next=p2;和p2=p1->next;是不是都代表p2指向p1的下一个地址?
p2->next=p1是什么意思
p2=p1;p1=p1->next;这个什么意思呀
staticinthand=0;p2->next=p1->next;oveax,dwRetret
p1=p2;p1->next!=NULL;p1=p1->next
C语言问题:下面的代码 p1++,p2++是代表什么:*p1=*p2,请详细解说下指针的用法?
C语言问题:int a[10],*P1,*P2; P1 =& a[0]; P2 =& a[5];
C语言中*p1=*p2与p2=p1有什么区别?都是指针型~谢谢啦