迴圈單鏈表的實現以及相關操作

2021-10-16 17:50:37 字數 4048 閱讀 1842

如果有不足之處我會加以改正,都是個人理解難免有錯誤的地方請諒解。

由之前的單鏈表、雙鏈表在到迴圈鍊錶三個鍊錶之間有很多重複和相似的地方。大體的邏輯關係是一致的,不同地方在於首位和每個節點之間的關係

單鏈表:每個節點之間依靠指標鏈結(方向為頭->尾頭節點尾節點->next均為null雙鏈表:每個節點之間有兩個指標(方向為互相指向頭節點->prior尾節點->next均為null

(單鏈表和雙鏈表本質就是單鏈表)

迴圈鍊錶:完全復刻單鏈表,唯一不同點在於尾節點->next=頭節點

綜上可知迴圈鍊錶的實現完全復刻於單鏈表,除了對尾節點的處理不同之外

和單鏈表相同,唯一不同在於將頭節點指向頭街(初始表頭既是頭節點又是尾節點

void initlinklist(linklist &l)//初始化單鏈表,強調表所以用linklist

else

}

定義乙個函式是否為空表

**和單鏈表一致,唯一不同在於對尾節點處理,將尾節點找到將指標指向頭節點即

void creatlist(linklist &l)//輸入資料

在迴圈內部加乙個判斷是否是尾節點即可,將其指向頭節點l(有沒有l->next=null是一樣的因為你賦值會將髒資料覆蓋掉但是寫上比較嚴謹)

對於迴圈尾節點的判斷記住是判斷(少數粗心寫成=會有不同結果如下)

輸出的邏輯在於輸入的邏輯唯一區別在於最後一步的處理將尾節點的指標指向表頭。現在輸出的邏輯的迴圈判斷條件就要發生改變

分析:當變數到最後乙個節點時候單鏈表的判斷條件是(節點->next!=null)如果節點的下乙個節點為空則跳出迴圈。現在對於迴圈鍊錶除了(節點->next!=null)還需要對最後乙個節點進行判斷,由於節點的遍歷是p=p->next所以動態節點每次指向的下乙個節點注意是下乙個節點。

個人經歷:我第一次書寫時候我的判斷條件增加了p->next!=l,看起來沒有問題但是迴圈內部的**(p=p->next)已經將尾節點指向了頭節點(l),所以如果這樣判斷的話,輸出會有問題會少輸出乙個尾節點(如下圖的錯誤**的輸出)

單鏈表:如果相對節點進行查詢,由於不具備隨機查詢的特徵所以只有從頭節點開始遍歷整個節點知道找到需要節點

雙鏈表:一樣的原理和性質很好理解只是不像單鏈表對於節點前驅節點無法處理,雙鏈表具有更高的靈活性比如(同時刪除i節點和i+2和i-2節點),如果是單鏈表處理就要進行多次遍歷(也可以一次完但是比較麻煩需要進行多次判斷節點),而雙鏈表只需要一次遍歷即可解決。適用於不同的環境都各自有特點

迴圈鍊錶:如果現在要求刪除所有節點但是每次刪除乙個節點且都是尾節點,這樣的條件下單鏈表和雙鏈表刪除一次就要遍歷一次會浪費很多的時間和資源。但迴圈鍊錶可以解決這個問題,對於頻繁的對頭尾處理的情況下可以將指標直接指向尾節點這樣(尾節點->next就是頭節點)會節省很多時間和資源。但是需要看情況而定,這裡按常規查詢元素

void getelem(linklist l, int i)

} printf("查詢第%d個元素為%d\n", i, p->data);

}}

按位查詢基本上和單鏈表的按位沒有區別,我這裡對尾節點進行了處理是為了體現迴圈鍊錶。可以在尾節點進行乙個判斷如果遍歷到了尾節點就可以指標指向第乙個節點(頭節點後第乙個節點),其實這樣的方法也可以用來對插入位置的合法進行判斷處理。如果在沒有獲取鍊錶長度情況下查詢元素已經到尾節點還可以查詢到就可以輸出(超出鍊錶範圍無法查詢)但是這個是多次一舉的設計,沒有直接獲取鍊錶長度可用性高同理

同理按值查詢的原理也和單鏈表是一直的這裡就省略了。

刪除資料**和單鏈表一致,在表位處的處理只需令i-1節點指向l即可(p->next = q->next;已經隱含了

刪除第i個元素

步驟:首先我們需要找到第i-1個節點-->對i-1節點進行判斷是否為尾節點(是:刪除節點不在鍊錶中,否:刪除第i個節點 )-->刪除第i個節點之後(將i-1節點指向頭節點同時釋放掉i節點)

void listdelet(linklist &l, int i)

if (p == null)//這裡是說明了i-1是尾節點

else

else

printf("刪除第%d節點元素%d成功\n", i, e);

void initlinklist(linklist &l)//初始化單鏈表,強調表所以用linklist

else

}void empty(linklist l)//檢查表是否為空

void creatlist(linklist &l)//輸入資料 }}

void getelem(linklist l, int i)

} printf("查詢第%d個元素為%d\n", i, p->data); }}

void listdelet(linklist &l, int i)

if (p == null)//這裡是說明了i-1是尾節點

printf("刪除內容為空");

lnode*q = p->next;

e = q->data;//記錄刪除的資料

if (p->next->next = l)

else

printf("刪除第%d節點元素%d成功\n", i, e);

}void showlist(linklist l)}

void main()

迴圈單鏈表及其相關操作實現

迴圈鍊錶的結束條件為p list.phead include 鍊錶結點 typedef struct listnode listnode 煉表頭 typedef struct list list 初始化 void init list list 銷毀鍊錶 void destroy list list ...

單鏈表常見功能的實現 以及逆轉等

include define size 40 using namespace std 實現乙個棧,用於後面將鍊錶中的元素先壓棧再彈出棧實現反向列印的功能 int stack size int top 0 棧頂指標 判空 int is empty 判滿 int is full 壓棧 void push...

單鏈表的相關操作

1.單鏈表的反轉 在這裡實現一種最簡單的鍊錶反轉的方法,遞迴反轉,在反轉當前借點之前先反轉後續的節點,這樣層層深入直到最後乙個子節點。package com.weibo.linkedlist public class reversenode public listnodes reverse list...