王道数据结构考研笔记之线性表的顺序表示

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