王道數據結構考研筆記之線性表的順序表示

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章