討論單鏈表之前,我們先來討論下面這個問題。
順序表存在的一些問題:
中間/頭部的插入刪除,時間複雜度為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...