資料結構之線性結構的離散儲存(迴圈列表和雙向鍊錶)

2021-07-03 22:21:42 字數 2251 閱讀 3680

迴圈列表:

將單鏈表中 終端節點的指標端由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。

迴圈鍊錶解決了乙個很麻煩的問題。如何從當中乙個結點出發,訪問到鍊錶的全部節點。

其實迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷p->next是否為空,現在則是

p->next不等於頭結點,則迴圈未結束。

單鏈表中,我們有了頭結點時,我們可以用0(1)的時間訪問第乙個結點,但對於要訪問最後乙個結點,

卻需要0(n)時間,因為我們需要將單鏈表全部掃瞄一遍。

有沒有可能用0(1)的時間由鍊錶指標訪問到最後乙個結點呢?當然可以

不過我們需要改造一下這個迴圈鍊錶,不用頭指標,而是用指向終端節點的尾指標來表示迴圈鍊錶,此時

查詢開始節點和終端節點都很方便

終端節點用尾指標rear指示,則查詢終端節點是0(1),而開始結點,其實就是rear->next->next,其時間複雜度也為0(1)。

將兩個迴圈鍊錶合併成乙個表時,有了尾指標非常簡單。

reara->next                                       reara

rearb->next   rearb->next                         rearb

p = reara->next ;  //儲存a表的頭結點

reara->next = rearb->next->next ; //將本是指向b表的第乙個結點(不是頭結點)

//賦值給reara->next

q = rearb->next;

rearb->next = p; //將a表的頭結點賦值給rearb->next

free(q);         //釋放q

雙向鍊錶:

我們在單鏈表中,有了next指標,這就使我們查詢下一結點的時間複雜度為0(1)。可是我們要查詢的是上一節點的話,那最壞的時間複雜度就是0(n).因為每次都要從頭開始遍歷查詢。

雙向鍊錶是在單鏈表的每個節點中,再設定乙個指向前驅結點的指標域。所以在雙向鍊錶中的節點都有兩個指標域,乙個指向直接後繼,另乙個指向直接前驅。

//線性表的雙向鍊錶儲存結構

typedef struct dulnode 

node;

typedef struct dulnode*  pnode;

既然單鏈表可以有迴圈鍊錶,那麼雙向鍊錶當然也可以是迴圈表。

由於這是雙向鍊錶,那麼對於鍊錶中的某乙個結點p,它的後繼的前驅是誰?當然還是他自己。它的前驅的後繼自然也是它自己。

p->next->prior = p = p->prior->next   .. 

在插入和刪除時,需要更改兩個指標變數。

插入操作時,其實並不複雜,不過順序很重要,千萬不能寫反了

我們現在假設儲存元素e的節點s,要實現將結點s插入到結點p和p->next之間需要下面幾步:

p                s             p->next

前驅ai後繼       前驅e後繼      前驅ai+1後繼

順序是先搞定s的前驅和後繼,再搞定後結點的前驅,最後解決前節點的後繼

s->prior = p;           //把p賦值給s的前驅

s->next = p->next;      //把p->next賦值給s的後繼

p->next->prior = s;     //把s賦值給p->next的前驅

p->next = s;            //把s賦值給p的後繼

如果插入操作理解,那麼刪除操作,就比較簡單。

若要刪除結點p,只需要下面兩步驟:

p->prior                p                    p->next

ai-1                    ai                   ai+1

p->prior->next = p->next;     //把p->next賦值給p->prior的後繼

p-next->prior = p->prior;     //把p->prior賦值給p->next前驅

free(p);                      //釋放節點

總的來說,線性表的這兩種結構其實是後面其他資料結構的基礎,把他們學明白了,對後面的學習至關重要。

線性表順序儲存結構                            鏈式儲存結構

單鏈表  靜態鍊錶  迴圈鍊錶     雙向鍊錶

詳細程式見:

資料結構之線性結構 棧 順序儲存

棧是一種受限的線性表,它規定只能夠在表的尾部進行插入和刪除,我們把允許插入和刪除元素的一端稱為棧頂,而另一段稱為棧底,沒有任何元素的元素棧稱為空棧。棧中的元素進出的規則為先入後出,即先進入棧的元素後出棧而後進入棧的元素先出棧。在對棧棧中的元素進行操作時只能夠操作棧頂的元素。棧中儲存元素的三種狀態 當...

資料結構之線性結構

資料結構學習虛函式,幾個知識點 1 抽象類函式本身不能直接例項化,需要其子類例項化虛函式,才能例項化。繼承抽象類的子類必須重寫虛函式,具體函式可實現,也可不實現。2 const修飾符,若修飾函式,則函式引數不能被改變。若修飾成員變數,則成員變數在使用過程中不被改變。修飾傳入引數,則避免引數被改變。3...

資料結構線性結構之連續儲存 陣列

鍊錶是線性資料結構中的一種,線性資料結構是指用接點關聯起來 它包含連續存入 陣列和離散儲存 鍊錶 最常用的應用如棧 佇列 陣列 元素型別相同,大小相等 指儲存的型別相等 php lua 和c陣列的比較 1 定義乙個陣列 php arr array 可以不指定大小直接指定,而且後續可以直接新增 lua...