資料結構筆記3 線性表的鏈式表示

2021-09-08 15:28:45 字數 3444 閱讀 3899

線性表的鏈式表示是用一組任意的儲存單元儲存線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的)。表示每個資料元素的兩部分(資料、後繼元素儲存位址)資訊組合在一起被稱為結點它包括兩個域:其中表示資料元素內容的部分被稱為資料域(data);表示直接後繼元素儲存位址的部分被稱為指標域(next),

指標域中儲存的資訊稱為指標鏈。

n個結點(ai(1≤i≤n)的儲存對映)鏈結成乙個鍊錶,即為線性表(a1,a2,… ai-1,ai,ai+1,…an)的鏈式儲存結構非順序對映)。

頭指標指示鍊錶中結點的儲存位址。

插入、刪除操作是不再需要移動大量的元素,但失去了順序表的可隨機訪問特點。

它是非隨機訪問結構。

鍊錶可分為單鏈表、迴圈鍊錶和雙向鍊錶。

鍊錶中的每乙個結點中只包含乙個指標域的稱為單鏈表線性鍊錶

訪問操作:

單鏈表是非隨機訪問結構。每個元素的位置資訊都包含在前驅結點的資訊中,所以取得第i個元素必須從頭指標出發尋找。設定乙個指標變數指向第乙個結點,然後,讓該指標變數逐一向後指向,直到第i個元素。假設p是指向線性表中第i個資料元素(結點ai)的指標,則p→next是指向第i+1個資料元素(結點ai+1)的指標,或若p→data=ai,則p→next→data= ai+1。

插入操作:

要在資料元素a和b 之間插入元素x。演算法思想:決定a和b之間的相鄰關係是由a 的指標決定的。若要實現插入,生成x結點,然後讓a 的指標指向x 且x 的指標指向b。實現三個元a、x和b的邏輯關係。設p為指向結點a 的指標,s為指向結點x的指標,則修改s、a的指標:s→next=p→next;p→next=s

刪除操作:

在單鏈表資料元素a、b、c三個相鄰的元素中刪除b,演算法思想:就是要讓a 的指標直接指向c,使b從鍊錶中脫離。即,p→next=p→next→next。可見,在已知鍊錶中元素插入或刪除的確切位置的情況下,在單鏈表中插入或刪除乙個結點時,緊需修改指標而不需要移動元素。

迴圈鍊錶:是另一種形式的鏈式儲存結構,其特點是表中最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。

迴圈鍊錶可分為單鏈和多鏈的。

迴圈鍊錶的操作:和線性鍊錶基本一致,差別僅在於迴圈條件判定是否為空改為是否為頭指標,即:p或p->next=s。

雙向鍊錶:在雙向鍊錶的結點中有兩個指標域,分別指向前驅和後繼。雙向鍊錶也可以有迴圈鍊錶。

雙向鍊錶的操作:

若d為指向表中某一接點的指標(即d為dulinklist 型變數),則顯然有d->next->prior=d->prior->next=d雙指標使得鍊錶的雙向查詢更為方便、快捷。nextelem和priorelem的執行時間為o(1)。僅需涉及乙個方向的指標的操作和線性鍊錶的操作相同。插入和刪除需同時修改兩個方向的指標。

在本章介紹了線性表的邏輯結構及它的兩種儲存結構:順序表和煉表。通過對它們的討論可知它們各有優缺點,順序儲存有三個優點:

(1) 方法簡單,各種高階語言中都有陣列,容易實現。

(2) 不用為表示結點間的邏輯關係而增加額外的儲存開銷。

(3) 順序表具有按元素序號隨機訪問的特點。

但它也有兩個缺點:

(1) 在順序表中做插入刪除操作時,平均移動大約表中一半的元素,因此對n較大的順序表效率低。

(2) 需要預先分配足夠大的儲存空間,估計過大,可能會導致順序表後部大量閒置;預先分配過小,又會造成溢位。

鍊錶的優缺點恰好與順序表相反。在實際中怎樣選取儲存結構呢?通常有以下幾點考慮:

1.基於儲存的考慮

順序表的儲存空間是靜態分配的,在程式執行之前必須明確規定它的儲存規模,也就是說事先對"maxsize"要有合適的設定,過大造成浪費,過小造成溢位。

可見對線性表的長度或儲存規模難以估計時,不宜採用順序表;鍊錶不用事先估計儲存規模,但鍊錶的儲存密度較低,

儲存密度是指乙個結點中資料元素所佔的儲存單元和整個結點所佔的儲存單元之比。顯然鏈式儲存結構的儲存密度是小於1的

2.基於運算的考慮

在順序表中按序號訪問ai的時間效能時o(1),而鍊錶中按序號訪問的時間效能o(n),所以如果經常做的運算是按序號訪問資料元素,顯然順序表優於鍊錶

而在順序表中做插入、刪除時平均移動表中一半的元素,當資料元素的資訊量較大且表較長時,這一點是不應忽視的;

在鍊錶中作插入、刪除,雖然也要找插入位置,但操作主要是比較操作,從這個角度考慮顯然後者優於前者

3.基於環境的考慮

順序表容易實現,任何高階語言中都有陣列型別,鍊錶的操作是基於指標的,相對來講前者簡單些,也是使用者考慮的乙個因素。

總之,兩中儲存結構各有長短,選擇那一種由實際問題中的主要因素決定。通常「較穩定」的線性表選擇順序儲存,

而頻繁做插入刪除的即動態性較強的線性表宜選擇鏈式儲存。

資料結構 線性表 線性表的靜態鏈式表示

資料結構 線性表的靜態鏈式表示 單鏈表 靜態鍊錶 線性表元素序號從1算起 l 0 專設為頭結點 date 2017 4 14 include include define initsize 100 define elemtype char typedef struct lnodelinklist i...

資料結構 線性表的鏈式表示(鍊錶)

下面介紹第二種順序表,也就是鍊錶 鍊錶有兩個,單鏈表和雙鏈表,先介紹單鏈表 include includetypedef struct nodenode,linklist node creatlist1 node head return head void output node head int ...

資料結構 線性表的鏈式表示與實現

上篇一篇部落格中我們介紹了線性表的順序表示與實現 順序表是按照順序將資料儲存到記憶體之中,雖然訪問方便但是也帶來了一些問題 1 順序表必須申請一整塊連續的記憶體 2 插入刪除元素時,當情況最壞時每個元素都要被移動 這兩個原因導致順序表的效率較低,為解決這兩個問題我們可以使用鏈式儲存的鍊錶來實現線性表...