資料結構導論-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;
}