原文:
對於單鏈表,由於每個結點只儲存了向後的指標,到了鍊錶末尾就停止了向後鏈的操作,這樣,結點就無法找到它的前驅結點了。
將單鏈表中終端結點的指標域由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。
迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷 p->next 是否為空,現在則是判斷 p->next 是否等於頭結點。
在單鏈表中,有了頭結點,我們可以用 o(1) 的時間訪問第乙個結點,但要訪問最後乙個結點,卻需要 o(n) 時間,因為我們要將單鏈表全部掃瞄一遍。
為了能用 o(1) 的時間由鍊錶指標訪問到最後乙個結點 ,我們需要改造一下這個迴圈鍊錶,將頭指標改為尾指標。
從圖中可以看出,尾結點用尾指標 rear 指示,則查詢終端結點的時間是 o(1), 而開始結點就是 rear->next->next,其時間複雜度也為 o(1)。
例如:有兩個迴圈鍊錶,它們的尾指標分別是 reara 和 rearb,將兩個迴圈鍊錶合併成乙個表。
p = reara->next;
/* 將 b 表的第乙個結點(不是頭結點)賦值給 reara->next */
reara->next = rearb->next-next;
/* 將原 a 表的頭結點賦值給 rearb->next */
rearb->next = p;
free(p);
雙向鍊錶是在單鏈表的每個結點,再新增乙個指向其前驅結點的指標域。所以在雙向鍊錶中,每個結點都有兩個指標域,乙個指向直接後繼結點,另乙個指向直接前驅結點。
線性表的雙向儲存結構
typedef struct dulnode dulnode, *dulinklist;
與單鏈表相比,雙向鍊錶可以反向查詢資料結構,但在插入和刪除時,需要更改兩個指標變數。
假設有乙個結點 s,要插入到結點 p 和 p-next之間:
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
若要刪除乙個結點,只需要兩個步驟
p->prior-next = p->next;
p->next-prior = p->prior;
free(p);
線性表複習完了,下一章開始複習棧與佇列。 程式猿必修課之資料結構(五)線性表3
對於單鏈表,由於每個結點只儲存了向後的指標,到了鍊錶末尾就停止了向後鏈的操作,這樣,結點就無法找到它的前驅結點了。將單鏈表中終端結點的指標域由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷...
程式猿必修課之資料結構(三)線性表1
線性表 list 零個或多個資料元素的有限序列。首先它是乙個序列。也就是說,元素之間是有順序的,若存在多個元素,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有且只有乙個前驅和後繼。其次,線性表強調是有限的。線性表元素的個數 n n 0 定義為線性表的長度,當 n 0 時,稱為空表。adt ...
程式猿必修課之資料結構(十)樹1
樹是一對多的資料結構 樹 tree 是 n n 0 個結點的有限集。n 0 時,稱為空樹。在任意一棵非空樹中 其實樹的定義用到了遞迴的方法。樹的每乙個結點包含乙個資料元素和若干個指向其子樹的分支。結點的度 結點擁有的子樹的個數稱為結點的度 degree 度為 0 的結點稱為葉結點 leaf 或終端結...