迴圈列表:
將單鏈表中 終端節點的指標端由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。
迴圈鍊錶解決了乙個很麻煩的問題。如何從當中乙個結點出發,訪問到鍊錶的全部節點。
其實迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷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...