鍊錶 單向鍊錶

2021-09-26 23:55:27 字數 3255 閱讀 7987

討論單鏈表之前,我們先來討論下面這個問題。

順序表存在的一些問題:

中間/頭部的插入刪除,時間複雜度為o(n)

增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗。

增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以後增容到200, 我們再繼續插入了5個資料,後面沒有資料插入了,那麼就浪費了95個資料空間。

為了解決順序表存在的這些問題,我們就要學習另外一種資料結構「鍊錶」。

鍊錶的概念及結構:

概念:鍊錶是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈 接次序實現的。 **

實際中煉表的結構非常多樣,以下情況組合起來就有8種鍊錶結構

4. 單向、雙向

5. 帶頭、不帶頭

6. 迴圈、非迴圈

1.單鏈表、雙向鍊錶

2.不帶頭單鏈表、單頭鍊錶

3.單鏈表、迴圈鍊錶

雖然有這麼多的鍊錶的結構,但是我們實際中最常用還是兩種結構:

1.無頭單向非迴圈鍊錶:結構簡單,一般不會單獨用來存資料。實際中更多是作為其他資料結構的子結 構,如雜湊桶、圖的鄰接表等等。另外這種結構在筆試面試**現很多

2. 帶頭雙向迴圈鍊錶:結構最複雜,一般用在單獨儲存資料。實際中使用的鍊錶資料結構,都是帶頭雙向 迴圈鍊錶。另外這個結構雖然結構複雜,但是使用**實現以後會發現結構會帶來很多優勢,實現反而 簡單了,後面我們**實現了就知道了。

單鏈表的各個介面即實現**:

//.**件 結點的定義,以及介面的宣告

#include#include#include#include#includetypedef int sltdatatype;

typedef struct slistnode

slistnode;

typedef struct slist

slist;

void slistinit(slist* plist); //建立乙個鍊錶

void slistdestory(slist* plist); //消除,清空

slistnode* buyslistnode(sltdatatype x) ; //動態開闢,判斷開多大

void slistpushback(slist* plist, sltdatatype x); //尾插

void slistpushfront(slist* plist, sltdatatype x); //頭插

void slistpopback(slist* plist); //尾刪

void slistpopfront(slist* plist); //頭刪

slistnode* slistfind(slist* plist, sltdatatype x); //查詢

// 在pos的後面進行插入

void slistinsertafter(slistnode* pos, sltdatatype x);

// 在pos的前面進行插入

void slisteraseafter(slistnode* pos);

void slistremove(slist* plist, sltdatatype x); //移動

void slistprint(slist* plist);

void testslist();

介面的具體實現:

void slistdestory(slist* plist)

}slistnode* buyslistnode(sltdatatype x)

//先構建乙個鍊錶

void slistinit(slist* plist)

//尾插

void slistpushback(slist* plist, sltdatatype x)

else

newtail = buyslistnode(x);

tail->_next = newtail; }}

//頭插

void slistpushfront(slist* plist, sltdatatype x)

//尾刪

void slistpopback(slist* plist)

else

free(tail);

prev->_next = null; }}

//頭刪

void slistpopfront(slist* plist)

else }

//首先先找到該節點

slistnode* slistfind(slist* plist, sltdatatype x)

cur = cur->_next;

} return cur;

}// 在pos的後面進行插入

void slistinsertafter(slistnode* pos, sltdatatype x)

// 在pos的前面進行插入

void slisteraseafter(slistnode* pos)

void slistprint(slist* plist)

printf("null\n");

}

4.順序表和煉表的區別和聯絡

加粗樣式順序表:

優點:空間連續、支援隨機訪問

缺點:1.中間或前面部分的插入刪除時間複雜度o(n)

2.增容的代價比較大。

鍊錶:

優點:1.任意位置插入刪除時間複雜度為o(1)

2.沒有增容問題,插入乙個開闢乙個空間。

缺點:以節點為單位儲存,不支援隨機訪問

鍊錶(單向鍊錶,雙向鍊錶)

首先鍊錶是以節點的方式儲存資料的,每個節點包含資料域 data 節點域 next 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...

資料結構 鍊錶 單向鍊錶

鍊錶 linked list 是由一連串的結構 稱為結點 組成的,其中每個結點都包含指向鏈中下乙個結點的指標。鍊錶中的最後乙個結點包含乙個空指標。鍊錶與陣列不同,陣列的線性序是由陣列的下標決定的,而鍊錶中的順序是由各結點的指標域所決定的。鍊錶可以靈活地表示動態集合。採用鍊錶表示線性表,無論向表中插入...

資料結構 鍊錶 單向鍊錶

單向鍊錶 插入刪除效率比陣列高 建立節點 node class node class list 追加節點 將值變為節點 let newnode new node element 判斷是否為空鍊錶 if this.head null else current.next newnode 長度必須加1 t...