程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於雙向鏈表的一些分析

關於雙向鏈表的一些分析

編輯:關於C語言

跟大家門交流一下:
一、插入操作(insert)
(一)基本原理    雙鏈表就好像是手拉手站成一排的人,每個人的右手(next)拉著下一個人,左手(prior)拉著前一個人,每兩個人之間有兩支手互聯.插入操作實際是向隊伍中增加人員,他需要拉上左右兩邊的人,即共三個人要發生關系,由於每兩個人之間有兩支手互聯,所以要發生4次操作.如已知節點
q,p,需插入s,稱為原型吧).
----------------------------------
    q->next
    --->
q          p    
   <---
    p->prior
 --------------------------------- 現在假設需插入節點s,則需進行以下4次操作: -----------------------------------------
 (1)(2)完成q與s的握手       
       (1)    q->next  = s;
       (2)    s->prior = q;     q->next
    --->
q          s    
   <---
    s->prior -----------------------------------------
(3)(4)完成s與p的握手  
    
       (3)  s->next  = p;
       (4)  p->prior = s;     q->next s->next
    ---> --->
q          s      p
   <---  <---
    s->prior p->prior
------------------------------------------- 對於本文的案例,是原型的變種, 只已知節點p,而不知節點q,但通過雙向鏈表的性質我們可以再初始時(插入前)得到以下關系:        p->prior = q; 所以對於以上的4次操作我們可以作等效替換,即將q 換為 p->prior,則以上4次操作為:
       (1)  p->prior->next  = s;
       (2)  s->prior = p->prior; file://(1)(2)完成q與s的握手      
       (3)  s->next  = p;
       (4)  p->prior = s;        file://(3)(4)完成s與p的握手
        (二)互換問題     由於不知道q節點,因此用p->prior來代替,所以p->prior的值應當在已經不再使用q節點的時候再改變,由原型:  (1)  q->next  = s;
 (2)  s->prior = q;
 (3)  s->next  = p;
 (4)  p->prior = s;
(4)改變了p->prior的值,而(1)(2)需使用q,所以(4)應當在(1)(2)後。
二、刪除操作(insert)
(一)基本原理
    刪除操作就好像某個人退出隊伍,但退出前他需要讓他兩邊的人把手拉上,以保持隊伍的連續性,也好像離職前要把工作要交接好,就好像我現在,哈...,如已知q,s,p, 需刪除s,由於只需兩個人發生關系,所以需進行以下兩次操作:        (1)  q->next  = p;
       (2)  p->prior = q;     q->next s->next
    ---> --->
q          s      p
   <---  <---
    s->prior p->prior
  q->next
    --->
q          p     
   <---
    p->prior 對於本例,是上面原型的變種,只已知s,但由雙向鏈表的性質,我們可以推出以下關系:        q == s->prior;
       p == s->next; 因此可做以下替換:        (1)  s->prior->next  = s->next;
       (2)  s->next->prior = s->prior; 由於s ,以及prior和next的值在兩次操作中並沒有被改變,因此(1)(2)的順序沒有關系. 三、一些結論  1)對於雙向鏈表的插入,只需知道插入位置的一個節點即可完成插入;
  2)對於雙向鏈表的刪除,只需知道刪除節點即可完成刪除。      因此對於雙向鏈表的插入和刪除在該情況下,時間度為O(1)。       個人拙見,歡迎大家批評指正.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved