關於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 僵屍網絡襲擊全球,遊戲行業最大攻擊流量有所下降