圖文並茂用地址分析雙向鏈表

網上很多對雙向鏈表解釋的文章都是用這個結構:

 圖文並茂用地址分析雙向鏈表

它們的連接情況是這樣的:

 圖文並茂用地址分析雙向鏈表

相當的不直觀,今天我要從詳細的地址出發來解釋雙向鏈表的原理。

 

現定義一個結構體如下:

struct student

{char name;

struct student *next;

struct student *prior;

};

現在有5個人A,B,C,D,E.這五個人構成的鏈表如下:

 圖文並茂用地址分析雙向鏈表

虛線部分爲地址值,這個是爲了描述方便隨便寫的值,在創建上述的鏈表時其實不用關心地址值到底是多少,這些地址都會放到某個變量當中,只要對變量進行賦值傳遞就能實現鏈表的構建。這裏完全是爲了分析才這麼寫的。從圖中很容易看出藍色的箭頭組成了一個單鏈表,紅色的箭頭又組成了一個單鏈表(逆向的)。

下面將分析鏈表的前插與刪除的例子,理解了這兩個功能,其他的功能都能自己分析出來了。

雙鏈表的前插,下面這是代碼和代碼分析。

void InsertBefore(student *p,char x)
      {//在帶頭結點的雙鏈表中,將值爲x的新結點插入*p之前,設p≠NULL
        student *s=malloc(sizeof(student)); //申請一段內存空間,指針指向首地址0x0600
        s->name=x; //定義name爲G
        s->prior=p->prior; // p->prior表示0x0500,將它賦給s->prior表示s->prior裏面的值是0x0500,從而指向0x0500這個地址即q,如紫線
        s->next=p; //p是0x0700,將它賦給s->next,s->next中的值爲0x0700,也即s->next指向了p,如綠色線
        p->prior->next=s; // p->prior 是0x0500,即指針q所指,所以p->prior->next相當於沒插入s之前的0x0700,插入s後,將s的首地址即0x0600賦給這個位置,所以此時,由q 到p的藍線斷裂,這個藍線目標變成了s,如黑線所示,此時q->next值爲0x0600,圖上沒有改過來。
        p->prior=s; //同理,p->prior也指向了s,即p->prior中0x0500變成了0x0600(圖上沒有改過來),紅線斷裂。變成墨綠色線。至此前插完成。
       }
 

 圖文並茂用地址分析雙向鏈表

 

下面再分析刪除,刪除比較簡單,代碼如下:

void DeleteNode(student *p)
      {//在帶頭結點的雙鏈表中,刪除結點*p,設*p爲非終端結點
          p->prior->next=p->next;// 將p->next即0x0700送到q->next中,即0x0500被替換成了0x0700(圖中沒改過來),如紫線。
          p->next->prior=p->prior;// p->prior爲0x0300送到了s->prior即原本是0x0500的地方(圖中沒改過來),如綠線。
          free(p);//將p內存釋放,同時將之前的四根紅藍線全部斷裂,至此完成刪除任務。
 

 圖文並茂用地址分析雙向鏈表

 

 

 

 

 

 文章摘自 http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html

 

發佈了18 篇原創文章 · 獲贊 322 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章