1. 程式人生 > >資料結構導論-2.1 線性表的順序儲存

資料結構導論-2.1 線性表的順序儲存

線性表順序儲存的型別定義:

Const Int Maxsize=100 //預先定義一個足夠大的常數

typedef struct

{ datatype data[Maxsize]; //存放資料的陣列

int length; //順序表的實際長度

} SeqList; //順序表的型別為SqeList

SeqList L; //定義L為一個順序表

順序表的插入演算法描述:

void InsertSeqList(SeqList L, DataType x, int i)

{ int j;

if (L.length==maxsize) exit{"表滿"); //表空間已滿,不能插入

if (i<1 || i>L.length+1) exit("位置錯") ; //檢查插入位置的正確性

for (j=L.length; j>=i; j--)

L.data[j]=L.data[j-1];  //*結點向後移動

L.data[i-1]=x; //新元素插入

L.length++; //表長+1

}

順序表的刪除演算法描述:

void DeleteSeqList(SeqList L, int i)

{ int j;

if (i<1 || i>L.length) exit("非法位置") ; //檢查位置是否合法

for (j=i; j<L.length; j++)

L.data[j-1]=L.data[j]; //*結點向前移動

L.length--; //表長-1

}

順序表的定位演算法描述:

int LocateSeqList(SeqList L, DataType x)

{ int i=0;

While ((i<L.length) && (L.data[i]!=x)) //順序檢查資料元素值為x的結點

i++;

if (i<L.length) return i+1; //查詢成功,返回資料元素的序號

else return 0; //查詢不成功,返回0

}

順序表的求表長,讀表元素運算

順序表的求表長操作Length(L)直接輸出L.length即可。

順序表的讀表元素Get(L,i)直接輸出L.data[i-1]即可。

順序表的時間複雜度

順序表的插入演算法的時間複雜度為O(n)

順序表的刪除演算法的時間複雜度為O(n)

順序表的定位演算法的時間複雜度為O(n)

順序表的求表長和讀表元素的時間複雜度為O(1)

順序表演算法設計舉例】:

有順序表A和B,其元素均按從小到大的升序排列,編寫一個演算法將它們合併成一個順序表C,要求C的元素也是從小到大的升序排列。

演算法思路分析:

依次掃描通過A和B的元素,比較當前的元素的值,將較小值的元素賦給C,如此直到一個線性表掃描完畢,然後將未完的那個順序表中餘下部分賦給C即可。C的容量要能夠容納A、B兩個線性表相加的長度。

演算法描述:

void merge(SeqList A, SeqList B, SeqList C)

{   int i,j,k;

i=0; j=0; k=0;

while ( i<A.length && j<B.length ) //將A和B的當前元素較小者複製到表C

if (A.data[i]<B.data[j])

C.data[k++]=A.data[i++];

else C.data[k++]=B.data[j++];

while (i<A.length ) /*將A中剩餘元素複製到表C*/

C.data[k++]= A.data[i++];

while (j<B.length ) /*將B中剩餘元素複製到表C */

C.data[k++]=B.data[j++];

C.length=k;

}