資料結構學習單鏈表,順序表和煉表的比較
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 使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶...