線性表 線性表的順序儲存結構

2021-09-07 10:47:47 字數 3957 閱讀 2005

線性表的順序儲存結構

線性結構是乙個資料元素的有序(次序)集

集合中必存在唯一的乙個「第一元素」;

集合中必存在唯一的乙個「最後元素」;

除最後元素外,均有唯一的後繼

除第一元素外,均有唯一的前驅

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

+1​p

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...

線性表定義 線性表順序儲存結構

線性表 由零個或多個資料元素組成的有限序列。簡單的說,就像排隊一樣,具有先一樣性質的結構。關鍵 資料元素的個數稱為線性表的長度,當線性表長度為零時,稱為空表。表起始位置稱表頭,表結束位置稱表尾。線性表有兩種物理儲存結構 順序儲存結構和鏈式儲存結構。物理上的儲存方式事實上就是在記憶體中找個初始位址,然...