資料結構學習 單鏈表,順序表和煉表的比較

2021-08-31 14:19:32 字數 3332 閱讀 7364

資料結構學習單鏈表,順序表和煉表的比較

2006-10-29 16:26

單鏈表1、鏈結儲存方法

鏈結方式儲存的線性表簡稱為鍊錶(linked list)。

鍊錶的具體儲存表示為:

① 用一組任意的儲存單元來存放線性表的結點(這組儲存單元既可以是連續的,也可以是不連續的)

② 鍊錶中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關係,在儲存每個結點值的同時,還必須儲存指示其後繼結點的位址(或位置)資訊(稱為指標(pointer)或鏈(link))

注意:鏈式儲存是最常用的儲存方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的資料結構。

2、鍊錶的結點結構

┌──┬──┐

│data│next│

└──┴──┘

data域--存放結點值的資料域

next域--存放結點的直接後繼的位址(位置)的指標域(鏈域)

注意:①鍊錶通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈結在一起的。

②每個結點只有乙個鏈域的鍊錶稱為單鏈表(single linked list)。

3、頭指標head和終端結點指標域的表示

單鏈表中每個結點的儲存位址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指標head指向開始結點。

注意:鍊錶由頭指標唯一確定,單鏈表可以用頭指標的名字來命名。

【例】頭指標名是head的鍊錶可稱為表head。

終端結點無後繼,故終端結點的指標域為空,即null。

4、單鏈表的一般圖示法

由於我們常常只注重結點間的邏輯順序,不關心每個結點的實際位置,可以用箭頭來表示鏈域中的指標。

5、單鏈表型別描述

typedef char datatype; //假設結點的資料域型別為字元

typedef struct nodelistnode;

typedef listnode *linklist;

listnode *p;

linklist head;

注意:①linklist和listnode *是不同名字的同乙個指標型別(命名的不同是為了概念上更明確)

②linklist型別的指標變數head表示它是單鏈表的頭指標

③listnode *型別的指標變數p表示它是指向某一結點的指標

6、指標變數和結點變數

┌────┬────────────┬─────────────┐

│    │    指標變數    │     結點變數     │

├────┼────────────┼─────────────┤

│ 定義 │在變數說明部分顯式定義 |在程式執行時,通過標準 │

│ │ │函式malloc生成 │

├────┼────────────┼─────────────┤

│ 取值 │ 非空時,存放某型別結點 │實際存放結點各域內容 │

│ │的位址 │ │

├────┼────────────┼─────────────┤

│操作方式│ 通過指標變數名訪問 │ 通過指標生成、訪問和釋放 │

└────┴────────────┴─────────────┘

①生成結點變數的標準函式

p=( listnode *)malloc(sizeof(listnode));

//函式malloc分配乙個型別為listnode的結點變數的空間,並將其首位址放入指標變數p中

②釋放結點變數空間的標準函式

free(p);//釋放p所指的結點變數空間

③結點分量的訪問

利用結點變數的名字*p訪問結點分量

方法一:(*p).data和(*p).next

方法二:p-﹥data和p-﹥next

④指標變數p和結點變數*p的關係

指標變數p的值——結點位址

結點變數*p的值——結點內容

(*p).data的值——p指標所指結點的data域的值

(*p).next的值——*p後繼結點的位址

*((*p).next)——*p後繼結點

注意:① 若指標變數p的值為空(null),則它不指向任何結點。此時,若通過*p來訪問結點就意味著訪問乙個不存在的變數,從而引起程式的錯誤。

順序表和煉表的比較

順序表和煉表各有短長。在實際應用中究竟選用哪一種儲存結構呢?這要根據具體問題的要求和性質來決定。通常有以下幾方面的考慮:

┌───┬───────────────┬───────────────┐

│ │   順序表    │   鍊錶    │

├─┬─┼───────────────┼───────────────┤

│基│分│靜態分配。程式執行之前必須明確│動態分配只要記憶體空間尚有空閒,│

│於│配│規定儲存規模。若線性表長度n變 │就不會產生溢位。因此,當線性表│

│空│方│化較大,則儲存規模難於預先確定│的長度變化較大,難以估計其儲存│

│間│式│估計過大將造成空間浪費,估計太│規模時,以採用動態鍊錶作為儲存│

│考│ │小又將使空間溢位機會增多。 │結構為好。 │

│慮├─┼───────────────┼───────────────┤

│ │存│為1。當線性表的長度變化不大, │<1 │

│ │儲│易於事先確定其大小時,為了節約│ │

│ │密│儲存空間,宜採用順序表作為儲存│ │

│ │度│結構。 │ │

├─┼─┼───────────────┼───────────────┤

│基│存│隨機訪問結構,對錶中任一結點都│順序訪問結構,鍊錶中的結點,需│

│於│取│可在o(1)時間內直接取得 │從頭指標起順著鏈掃瞄才能取得。│

│時│方│線性表的操作主要是進行查詢,很│ │

│間│法│少做插入和刪除操作時,採用順序│ │

│考│ │表做儲存結構為宜。 │ │

│慮├─┼───────────────┼───────────────┤

│ │插│在順序表中進行插入和刪除,平均│在鍊錶中的任何位置上進行插入和│

│ │入│要移動表中近一半的結點,尤其是│刪除,都只需要修改指標。對於頻│

│ │刪│當每個結點的資訊量較大時,移動│繁進行插入和刪除的線性表,宜採│

│ │除│結點的時間開銷就相當可觀。 │用鍊錶做儲存結構。若表的插入和│

│ │操│ │刪除主要發生在表的首尾兩端,則│

│ │作│ │採用尾指標表示的單迴圈鍊錶為宜│

└─┴─┴───────────────┴───────────────┘

儲存密度(storage density)是指結點資料本身所佔的儲存量和整個結點結構所佔的儲存量之比,即

儲存密度=(結點資料本身所佔的儲存量)/(結點結構所佔的儲存總量)

資料結構 順序表和單鏈表

typedef struct sqlist sqlist,psqlist bool isfull psqlist psq bool isempty psqlist psq void initsqlist psqlist psq 初始化 bool insert psqlist psq,int pos,...

資料結構學習 鍊錶

將從下面4部分進行介紹 首先介紹鍊錶是什麼,然後介紹為什麼定義鍊錶,接著是鍊錶的分類,最後簡單介紹一下鍊錶結點的插入與刪除方法。首先,在介紹鍊錶之前,我們先介紹一下什麼是順序儲存結構。我們知道資料在計算機中的儲存就像貨物在倉庫中的儲存一樣,不但占用一定的空間,還要有乙個標示儲存位置的位址。計算機通過...

資料結構學習 鍊錶

由於不必須按順序儲存,鍊錶在插入的時候可以達到o 1 的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o n 的時間,而線性表和順序表相應的時間複雜度分別是o logn 和o 1 使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶...