線性表是一對一的邏輯關係,要存放在計算機中,可採用順序、鏈式兩種儲存結構。
因此:將順序表歸納為:關係線性化,結點順序存。
給出線性表儲存的線性公式:
假設線性表中有 n 個元素,每個元素佔 k 個單元,第乙個元素的位址為 loc(a1) 則可通過如下公式計算出第 i 個元素的位址loc(ai):借助 c 語言的陣列型別,來表示順序表:loc(ai) =loc(a1)+(i-1)×k (2-1)其中 loc(a1) 稱為基位址。
#definemaxsize 100
/*此處的巨集定義常量表示線性表可能達到的最大長度*/
typedef
struct
seqlist;
【演算法思想】查詢運算可採用順序查詢法實現,即從第乙個元素開始,依次將表中元素與 e 相比較,若相等,則查詢成功,返回該元素在表中的序號;若 e 與表中的所有元素都不相等,則查詢失敗,返回-1。
【演算法描述】 線性表的查詢運算
int
locate
(seqlist l,elemtype e)
/*在順序表 l 中依次存放著線性表中的元素,在表中查詢與 e 相等的元素,若 l.elem[i]=e,則找到該元素,
並返回 i+1,若找不到,則返回「-1」*/
演算法的時間複雜度為 o(n)。
【演算法描述】
#define ok 1
#define error 0
intinslist
(seqlist *l,
int i,elemtype e)
/*在順序表 l 中第 i 個資料元素之前插入乙個元素 e。 插入前表長 n=l->last+1,
i 的合法取值範圍是 1≤i≤l->last+2 */
if(l->last>= maxsize-1)
for(k=l->last;k>=i-
1;k--
)/*為插入元素而移動位置*/
l->elem[k+1]
=l->elem[k]
; l->elem[i-1]
=e;/*在 c 語言陣列中,第 i 個元素的下標為 i-1*/
l->last++
;return
(ok)
;}
【演算法分析】當在表尾(i= l->last+2)插入元素時,因為迴圈的終值大於初值,此時不需要移動元素,可直接在表尾插入 e。當在表頭(i= 1)插入時,移動元素的語句 l->elem[k+1]=l->elem[k]需執行 n次,即將表中已存在的 n 個元素依次後移乙個位置才能將 e 插入。因此,語句l>elem[k+1]=l>elem[k]的語句執行頻度與插入位置 i 有關。
線性表的刪除運算是指將表的第 i(1≤i≤n)個元素刪去,使長度為 n 的線性表 (e1,…,ei-1,ei,ei+1,…,en),變成長度為 n-1 的線性表(e1,…,ei-1,ei+1,…,en)。
【演算法思想】用順序表作為線性表的儲存結構時,由於結點的物理順序必須和結點的邏輯順序保持一致,因此當需要刪除第 i 個元素時,必須將原表中位置在 i+1,i+2,…,n-1,n 上的結點,依次前移到位置 i,i+1, …n-1。(其中 n 為 l 的表長度)
【演算法描述】
int
dellist
(seqlist *l,
int i,elemtype *e)
/*在順序表 l 中刪除第 i 個資料元素,並用指標引數 e 返回其值。i 的合法取值為 1≤i≤l.last+1 */
*e= l->elem[i-1]
;/* 將刪除的元素存放到 e 所指向的變數中*/
for(k=i;i<=l->last;k++
) l->elem[k-1]
= l->elem[k]
;/*將後面的元素依次前移*/
l->last--
;return
(ok)
;}
【演算法分析】與插入運算類似,在順序表上實現刪除運算也必須移動結點,這樣才能維持線性表結點間的邏輯關係。當刪除表尾(i=l->last+1)元素時,因為迴圈變數的初值大於終值,此時不需要移動元素,僅將表長度減 1 即可。當刪除表頭元素(i= 1)時,移動元素的語句 l->elem[k+1]=l->elem[k]需執行 n-1 次。因此刪除演算法中移位語句 l->elem[k-1]= l->elem[k]的執行頻度與刪除位置 i 有關。
由以上分析可知,在順序表中插入和刪除乙個資料元素時,其時間主要耗費在移動資料元素上。作一次插入或刪除平均需要移動表中一半元素,當 n 較大時演算法效率較低。
2 2線性表的順序儲存
線性表的順序儲存指的是將線性表的資料元素按其邏輯次序依次存入一組位址連續的儲存單元裡,用這種方法儲存的線性表稱為順序表。順序儲存結構的特點 元素在表中的相鄰關係,在計算機記憶體中存在著相鄰關係。線性表的第乙個元素a1的儲存位置通常稱為基位址。只要知道基位址和每個元素占用的單元數 元素的大小 就可求出...
線性表順序儲存基本操作
線性表的基本操作 status,自定義的乙個列舉型別,enum status status list init sqlistptr l 初始化線性表 void list clear sqlistptr l 清空線性表 void list destory sqlistptr l 銷毀線性表 bool ...
線性表順序儲存的基本操作
線性表的操作主要包括如下幾個 初始化,插入,刪除,查詢 單個元素所在的位置,某個位置的具體元素,查詢所有的元素 判斷是否為空,兩個線性表合併 當需要對線性表進行修改的時候,要傳遞線性表變數的位址。否則的話,只需要傳遞傳遞變數即可 至於原因 想想當初自定義函式中對兩個元素進行交換的實現 include...