資料結構 線性表鏈式儲存結構

2021-07-02 03:01:33 字數 2792 閱讀 3731

鏈式儲存 :用一組任意的儲存單元儲存線性表中的資料元素。用這種方法儲存的線性表簡稱線性鍊錶。

儲存鍊錶中結點的一組任意的儲存單元可以是連續的,也可以是不連續的,甚至是零散分布在記憶體中的任意位置上的。

鍊錶中結點的邏輯順序和物理順序不一定相同。(即不要求邏輯上相鄰的元素在物理位置上也相鄰)

為了正確表示結點間的邏輯關係,在儲存每個結點值的同時,還必須儲存指示其直接後繼結點的位址(或位置),稱為指標(pointer)或鏈(link),這兩部分組成了資料元素ai的儲存映像

鍊錶是通過每個結點的指標域將線性表的n個結點按其邏輯次序鏈結在一起的。

每乙個結點只包含乙個指標域的鍊錶,稱為單鏈表。

為操作方便,總是在鍊錶的第乙個結點之前附設乙個頭結點(頭指標)head指向第乙個結點(即頭結點的指標域存放第乙個結點的儲存位置)。頭結點的資料域可以不儲存任何資訊(或鍊錶長度等資訊)。

因為最後乙個資料元素沒有直接後繼,所以線性鍊錶中最後乙個結點的指標為空(null)。

為操作方便,總是在鍊錶的第乙個結點之前附設乙個頭結點(頭指標)head指向第乙個結點(即頭結點的指標域存放第乙個結點的儲存位置)。頭結點的資料域可以不儲存任何資訊(或鍊錶長度等資訊)。

因為最後乙個資料元素沒有直接後繼,所以線性鍊錶中最後乙個結點的指標為空(null)。

c語言中用帶指標的結構體型別來描述
typedef

struct lnode

lnode, *linklist; /*結點的型別名 */

lnode,結點結構;linklist:鍊錶結構

//linklist l;l為單鏈表名,同時也可作為表的頭指標名,指向表中第乙個結點,即l的指標域儲存第乙個結點的位址。

//若l為空,則表示線性表為空表,其長度為0.

結點的實現

結點是通過動態分配和釋放來的實現,即需要時分配,不需要時釋放。實現時是分別使用c語言提供的標準函式:malloc() ,realloc(),sizeof() ,free() 。

動態分配 p=(lnode*)malloc(sizeof(lnode));

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

動態釋放 free(p) ;

系統**由指標變數p所指向的記憶體區。p必須是最近一次呼叫malloc函式時的返回值。

演算法描述

lnode *create_linklist(void)

/* 頭插入法建立單鏈表,鍊錶的頭結點head作為返回值 */

return (head);

} // 返回值是表頭結點head,實際就是所建立的鍊錶。此時主函式中只要建乙個lnode *型別的變數,即可呼叫該函式。如

lnode *head; 或者linklist head;

head=create_linklist();

頭插入法建立鍊錶雖然演算法簡單,但生成的鍊錶中結點的次序和輸入的順序相反。若希望二者次序一致,可採用尾插法建表。

該方法是將新結點插入到當前鍊錶的表尾,使其成為當前鍊錶的尾結點。

演算法描述

lnode *create_linklist(void)

/* 尾插入法建立單鏈表,鍊錶的頭結點head作為返回值 */

return (head);

}

無論是哪種插入方法,如果要插入建立單鏈表的結點是n個,演算法的時間複雜度均為o(n)。

對於單鏈表,無論是哪種操作,只要涉及到鉤鏈(或重新鉤鏈),如果沒有明確給出直接後繼,鉤鏈(或重新鉤鏈)的次序必須是「先右後左」,否則就會丟掉鍊錶中的一些結點。

(1) 按序號查詢 取單鏈表中的第i個元素。

對於單鏈表,不能象順序表中那樣直接按序號i訪問結點,而只能從鍊錶的頭結點出發,沿鏈域next逐個結點往下搜尋,直到搜尋到第i個結點為止。因此,鍊錶不是隨機訪問結構。

設單鏈表的長度為n,要查詢表中第i個結點,僅當1≦i≦n時,i的值是合法的。

演算法思想如下:

從頭結點開始順鏈掃瞄,用指標p指向當前掃瞄到的結點,用j作統計已掃瞄結點數的計數器,當p掃瞄下乙個結點時,j自動加1。

p的初值指向頭結點,j的初值為1。當j=i時,指標p所指的結點就是第i個結點。

演算法描述

elemtype get_elem(lnode *l , int i)

/* 移動指標p , j計數 */

if ( !p|| j>i) return(error) ;

/* p為null 表示i>n; j>i表示i=0 */

else

return(p->

data);

}移動指標p的頻度:

i=0時:0次; i∈[

1,n]

:i-1次;i>n:n次。

∴時間複雜度: o(n)。

按值查詢

按值查詢是在鍊錶中,查詢是否有結點值等於給定值key的結點? 若有,則返回首次找到的值為key的結點的儲存位置;否則返回null。查詢時從開始結點出發,沿鍊錶逐個將結點的值和給定值key作比較。

演算法描述

lnode *locate_node(lnode *l,int key)

/* 在以l為頭結點的單鏈表中查詢值為key的第乙個結點 */

}演算法的執行與形參key有關,平均時間複雜度為o(n)。

資料結構 線性表(鏈式儲存結構)

用一組任意的儲存單元儲存線性表的資料結構,這組儲存單元可以是連續的,也可以是不連續的。對資料結構ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其後繼的資訊 即直接後繼的儲存位置 資料域 儲存資料元素資訊的域。指標域 儲存直接後繼位置的域。資料域 指標域 結點 n個結點鏈結成乙個鍊錶,即為線性表...

資料結構 線性表鏈式儲存

對於線性鍊錶,有兩種表示方法,一種是包含頭節點的情況,如下圖 一種是不包含頭節點的情況,如下圖 本文中對線性鍊錶的表示,利用的是帶頭節點的定義方式。使用c 實現了線性鍊錶建立,初始化,刪除,插入,清空,遍歷,有序鍊錶合併等操作。煉表頭 頭指標 頭結點 煉表頭 指的是線性表第乙個元素所在結點 頭指標 ...

資料結構 線性表(鏈式儲存)

1 順序表 需要一片連續的記憶體空間,成員可以隨機訪問,訪問效率高 插入刪除資料存在資料搬移的現象,效率低 儲存密度高 鍊錶的特點 不需要連續的記憶體空間,不能隨機訪問元素,訪問效率低 插入刪除資料不存在資料搬移的現象,效率高 儲存密度比較低 2 無頭鍊錶 第乙個節點為資料節點,加入刪除第乙個節點,...