1、順序表的定義
線性表的順序存儲又稱順序表。它是用一組地址連續的存儲單元依次存儲線性表中的數據元素,從而使得邏輯上相鄰的兩個數據在物理位置上也相鄰。
靜態分配的結構
#define MaxSize 50
typedef struct{
ElemType data[MaxSize]; //順序表的元素
int length; //順序表當前長度
}SqList;
動態分配的結構
#define InitSize 100
typedef struct{
ElemType *data;
int MaxSize,length;
}
數組下標從0開始,線性表元素從1開始
2、順序表上基本操作實現
插入操作
bool ListInsert(SqList &L, int i, ElemType e){
if(i<1 || i>L.length+1){return false;}//判斷i的範圍是否有效
if(L.length>=MaxSize) return false; //存儲空間已滿
for(int j=L.length;j>=i;j--){//將第i個元素及之後的元素後移一位
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
return true;
}
最好情況:在表尾插入,元素後移語句不執行,時間複雜度爲O(1)
最壞情況:在表頭插入,元素後移語句執行n次,時間複雜度爲O(n)
平均情況:假設Pi=1/(n+1)是在第i個位置上插入一個節點的概率,則在長度爲
n的線性表中插入一個節點,所需移動節點的平均次數爲n/2,因此時間複雜度爲O(n)
刪除操作
bool ListDelete(SqList &L, int i, ElemType e){
if(i<1 || i>L.length) return false; //判斷i是否有效
e = L.data[i-1];//將被刪除的元素賦值給e
for(int j=i;j<L.length;j++){ //i位置後的元素前移
L.data[j-1] = L.data[j];
}
L.length--; //長度減一
return true;
}
最好情況:刪除表尾元素,無需移動元素,時間複雜度爲O(1)
最壞情況:刪除表頭元素,元素前移n次,時間複雜度O(n)
平均情況:Pi=1/n爲刪除i位置上節點的概率,則在長度爲n的線性表中刪除一
個節點的平均次數爲(n-1)/1,因此時間複雜度爲O(n)
按值查找(順序查找)
int LocateElem(SqList L, ElemType e){
int i;
for(i=0; i<L.length; i++){
if(L.data[i]==e) return i+1;
}
return 0;
}
最好情況:查找元素在表頭,僅需一次,時間複雜度爲O(1)
最壞情況:查找元素在表尾,需要比較n次,時間複雜度爲O(n)
平均情況:Pi=1/n是查找的元素在第i個位置上的概率,則在長度爲n的線性表
中查找e的平均次數爲(n+1)/2,因此時間複雜度爲O(n)