閱讀990 返回首頁    go 阿裏雲 go 技術社區[雲棲]


關於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

  上一篇:go android自定義view實現progressbar的效果
  下一篇:go android自定義view實現progressbar的效果