关于p->next=p;和p=p->next;的刨根问底(也有转的内容)
qq群里面有个哥们问我这个问题,我是一个喜欢在事物的原理方面刨根问底的人。
帮他在网上找了一篇不错的回答,但是自己还想亲手编程证实。百度知道的地址:https://zhidao.baidu.com/link?url=O1UyyyHkTWs-KkUefQOzbwASO5n3q3BDZ5ToV4VAHryv4EBbdpVNJ88qD5NfqccMnX79zVt8mofXl01pnOVXnK(详细内容附后)
(I) 证实p=p->next;
#include<iostream> #include<math.h> using namespace std; typedef struct node { int data; struct node *next; }NODE; int main(void) { NODE a,b,c; NODE *p; a.data=1; a.next=&b; b.data=2; b.next=&c; c.data=3; c.next=&a; p=&a; while(p!=NULL) { printf("%d\n",p->data); p=p->next; //p->next放的是下一个的地址 eg.0x0018ff38 } return 0; }
直接贴出运行结果,我觉得就可以说明问题了,相当于p->next是一个指针,这个指针就要指向一个东西(就是下一个节点),但是这个指针里面放的是一个地址
(II) 证实p->next=p;
代码略改一行:
while(p!=NULL) { printf("%d\n",p->data); p->next=p; }

下面贴出网上回答内容:
p->next=p表示节点p的下一个节点还是p,如果链表只有p节点,那么这样就变成了一个循环链表 p=p->next表示修改指针p的位置,把p指向原来的下一个节点
追问
你的意思是p->next=p是修改结点位置,而p=p->next是修改指针位置?
回答
不是,假如链表为 p1-p2-p3-....... p1->next=p1,那么链表就断了,p2,p3会找不到了,链表变成了 p1--| |-----| 也就是它自己指向自己了
追问
p1->next=p1,那么链表就断了,p2,p3会找不到了 这个不是通过将指向p1的指针转到指向p2,使得p1消失?怎么会p2,p3找不到呢
回答
这里有一个连如下: ......->[0000]->[1111]->[2222]->[3333]->........ | p 开始时p指向节点[0000],那么p->next指向的是节点[1111] 如果执行语句 p->next=p,实际上就是修改了指针p->next的位置,p没有变,链表变成了: ......->[0000]->| |_____| p 这个样了,其它节点还在,但是不能遍历它们了,因为p->next 还是它自己本身,所以其它节点就找不到了 如果执行p=p->next,这样是修改了p位置,链表变成如下: ......->[0000]->[1111]->[2222]->[3333]->........ | p
追问
昨晚办公室关没了,没来得及看哈 嗯嗯,终于理解了,不过我怎么觉得那p->next=p;没什么用了。。。
回答
那就要看特定情况下了,例如创建一个没有头结点的循环链表时,开始第一个节点就要这样了,如果不是第一个节点那就有 p->next=head; head表示第一个节点,p为最后一个节点
- 提问者评价
-
嗯,谢谢!这样随时在线的也不容易
最后更新:2017-04-03 05:39:47
上一篇:
android自定义view实现progressbar的效果
下一篇:
android自定义view实现progressbar的效果
Java中利用final关键字inline编译优化真的有效吗?
让CarbonData使用更简单
Hash算法,及HashMap使用
Progressive JPEG图片渐进加载方案
Android研究院之ListView原理学习与优化总结
Is 2017 a crisis year for DDoS attacks?
《Apache Common官方文档》翻译邀请
安全宝分析DDoS攻击成主要破坏手段
【云周刊】第135期:云栖大会珍贵技术资料:20+覆盖容器技术、智能工业、大数据、开源数据库
游戏安全资讯精选 2017年 第五期:国际网络犯罪基础设施被曝光,WireX 僵尸网络袭击全球,游戏行业最大攻击流量有所下降