線性表的順序儲存結構
線性結構是乙個資料元素的有序(次序)集。
集合中必存在唯一的乙個「第一元素」;
集合中必存在唯一的乙個「最後元素」;
除最後元素外,均有唯一的後繼;
除第一元素外,均有唯一的前驅。
adt list容易混的概念:引用符號&,和引用型操作沒有關係資料關係:
r1= adt list
加工型操作:
遍歷:按照一定的規則對資料結構中每個元素訪問且只訪問一次。
例1.假設:有兩個集合a和b分別用兩個線性表la和lb表示,即:線性表中的資料元素即為集合中的成員。
現要求乙個新的集合a=a∪
\cup
∪b。上述問題可演繹為:
對線性表作如下操作:
擴大線性表la,將存在於線性表lb中而不存在於線性表la中的資料元素插入到線性表la中去。
操作步驟:
從線性表lb中依次檢視每個資料元素;
e
←
\gets
←getelem(lb,i,&e)
若不存在,則插入;
eleminsert(&la,n+1,e)
(n表示線性表la當前長度,線性表位序從1開始)
void union(list& la,list lb)
//for
}//union
例2.
歸併兩個「其資料元素按值非遞減有序排列」的有序表la和lb,求得有序表lc也具有同樣特性。
注意:歸併和求並集的區別,歸併是把兩個集合所有元素合在一起,沒有捨棄任何元素。
設la=(a1,…,ai,…,an),
lb=(b1,…,bj,…,bm),
求得lc=(c1,…,ck,…,cm+n)
且已由(a1,…,ai-1)和(b1,…,bj-1)歸併得(c1,…,ck-1)則ck=
a_i, a_i \leq b_j & \\ & k=1,2,...,m+n \\ b_j,a_i > b_j & \end \right.
ck=⎩⎨
⎧ai
,ai
≤bj
bj
,ai
>bj
k=
1,2,
...,
m+n
基本操作:
初始化lc為空表;
分別從la和lb中取得當前元素ai和bj;
若ai≤
\leq
≤ bj,則將ai插入到lc中,否則將bj插入到lc中;
重複2和3,直至la或lb中元素被取完為止;
將la表或lb表剩餘元素按順序插入到lc中。
void mergelist(list la,list lb,list& lc)
else
}while(i<=la_len)
while(j<=lb_len)
}
1.順序映像
以x的儲存位置和y的儲存位置之間某種關係表示邏輯關係
最簡單的一種順序映像方法是:
令y的儲存位置和x的儲存位置相鄰。
用一組位址連續的儲存單元依次存放線性表中的資料元素。
a1a2
…ai-1ai…
an↑\qquad \uparrow
↑線性表的起始位址,稱做線性表的基位址。
以「儲存位置相鄰」表示有序對i-1,ai>
即:loc(ai)=loc(ai-1)+c,c是乙個元素所佔儲存量。
所有資料元素的儲存位置均取決於第乙個資料元素的儲存位置。
loc(ai)=loc(a1)+(i-1)*c
loc(a1)是基位址。
所以,順序表的按序號查詢是一種隨機訪問結構。
注意:
#define listsize 100
//儲存空間最大分配量
typedef
struct
sqlist;
線性表的靜態分配順序儲存結構中,線性表的最多資料元素為listsize
,元素數量不能隨意增加,這是以陣列方式描述線性表的缺點。
為了實現線性表最大儲存資料元素可隨意變化,可以使用乙個動態分配的陣列來取代上面的固定長度陣列,如下描述。
#define list_init_size 100
//初始分配量
#define listincrement 20
//分配增量
typedef
struct
sqlist;
int
initlist
(sqlist& l)
int
initlist
(sqlist& l)
int
locateelem
(sqlist l,
int val)
return-1
;}
設元素都是等概率的,順序表按值查詢的平均比較次數是n/2,時間複雜度o(n)。
//在第i個元素之前插入指定元素
inteleminsert
(sqlist& l,
int i,
int val)
*p = val;
//插入val
++l.length;
//線性表表長加1
return0;
}
移動元素的平均情況:
假設在第i
ii個元素之前插入的概率為p
ip_i
pi,則在長度為n的線性表中插入乙個元素所需移動元素次數的期望值為:
e is
=∑i=
1n+1
pi(n
−i+1
)e_=\sum_^p_i (n-i+1)
eis=i
=1∑n
+1p
i(n
−i+1
) i=
p=1n
+1
p_i=p=\frac1
pi=p=
n+11
,則移動元素的期望值為:n
2\frac n 2
2n時間複雜度是o(n
)o(n)
o(n)
。
//刪除第i個元素
intelemdelete
(sqlist& l,
int i,
int&val)
--l.length;
//線性表長度減1
return0;
}
移動元素的平均情況:
設刪除第i
ii個元素的概率為q
iq_i
qi,則在長度為n
nn的線性表中刪除乙個元素所需移動元素次數的期望值為:
e dl
=∑i=
1nqi
(n−i
)e_=\sum_^q_i (n-i)
edl=i
=1∑n
qi
(n−i
) i=
q=1n
q_i=q=\frac1 n
qi=q=
n1,則移動元素的期望值為:n−1
2\frac 2
2n−1
演算法時間複雜度顯然也是o(n)。
線性表 線性表的順序儲存結構
include include using namespace std define ok 1 define error 0 define list init size 100 define listincrement 10 typedef int status typedef int elemty...
線性表 線性表的順序儲存結構
include include using namespace std define ok 1 define error 0 define list init size 100 define listincrement 10 typedef int status typedef int elemty...
線性表定義 線性表順序儲存結構
線性表 由零個或多個資料元素組成的有限序列。簡單的說,就像排隊一樣,具有先一樣性質的結構。關鍵 資料元素的個數稱為線性表的長度,當線性表長度為零時,稱為空表。表起始位置稱表頭,表結束位置稱表尾。線性表有兩種物理儲存結構 順序儲存結構和鏈式儲存結構。物理上的儲存方式事實上就是在記憶體中找個初始位址,然...