数据结构之顺序表的插入删除操作(静态分配实现)及其时间复杂度分析

1.顺序表的插入操作

插入元素的位置是i表示插入后,这个插入的元素是在 i 的位置, 即要先找到原先顺序表中i的位置所属元素, 插在此元素的前面即可

#include
#define MaxSize 5
typedef struct {
	int data[MaxSize]; //用静态数组存储当前数据
	int length; //当前顺序表的长度
} SqList;
void InitList(SqList &L) {
	for(int i = 0; i<MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}
bool ListInsert(SqList &L,int i,int e) {
	if(i<1 || i>L.length+1) { //判断 i的位置是否合法
		printf("插入的位置不合法,请重新定义i的值\n");
		return false;
	}
	if(L.length >= MaxSize){
		printf("存储已满,不能插入\n");
		return false; 
	}

	for(int j=L.length; j>=i; j--) //(j 和 i 都是位序)
		L.data[j] = L.data[j-1];
	L.data[i-1] =e;  //在位置 i 处放入e (i是位序)
	L.length++;   //长度+1
	return true;
}

int main() {
	SqList L;
	InitList(L);
	ListInsert(L,1,1);
	ListInsert(L,2,3);
	ListInsert(L,3,4);
	ListInsert(L,4,5);
	ListInsert(L,5,6);

	bool a= ListInsert(L,2,2);
	printf("%d\n",a);  //c语言中 bool类型就是 0 和 1, 因此可以用 %d 来输出 
	printf("%d,%d",L.data[1],L.length); //打印位序为2的元素和当前的顺序表表长
	return 0;
}

2.顺序表的删除操作

#include
#define MaxSize 5
typedef struct {
	int data[MaxSize];
	int length;

} SqList;

void InitList(SqList &L) {
	L.length = 5;
	for(int i=1; i<=L.length; i++){
		L.data[i-1] = i;
	//	printf("%d",L.data[i-1]);
	}
		

}
bool ListDelete(SqList &L,int i,int &e) {
	if(i<1 || i > L.length) {
		printf("删除的位置不合法\n");
		return false;
	}
	if(L.length == 0) {
		printf("当前表为空表,删除失败");
		return false;
	}
	e = L.data[i-1];
	for(int m=i; m<L.length; m++)
		L.data[m-1] =L.data[m];
	L.length --;
	return true;

}

int main() {
	SqList L;
	InitList(L);
	int e = -1;
	ListDelete(L,3,e);

	printf("%d",e);

}

3.顺序表插入操作的时间复杂度分析

最好情况:

新元素插入到表尾, 则不需要移动元素
i = n+1, 循环0次; 即最好时间复杂度 = O(1)

最坏情况

新元素插入到表头, 则表中的 n 个元素需要全部移动
i =1; 循环n次, 最坏时间复杂度 = O(n)

平均情况

新元素插入有(n+1)种选择,即插入每个位置的概率都是 p= 1/(n+1)
i =1 ,循环n次
i =2 ,循环n-1次

i =n+1, 循环 0次

平均循环次数: = np+(n-1)p+…+1*p = n/2
即 平均时间复杂度 = O(n)

4.顺序表删除操作的时间复杂度分析

最好情况:

删除表尾元素, 则不需要移动元素
i = n, 循环0次; 即最好时间复杂度 = O(1)

最坏情况

删除表头元素, 则表中的 n-1 个元素需要移动
i =1; 循环n-1次, 最坏时间复杂度 = O(n)

平均情况

删除操作有n种选择,即删除每个位置的概率都是 p= 1/n
i =1 ,循环n-1次
i =2 ,循环n-2次

i =n, 循环 0次

平均循环次数: = (n-1)p+…+1*p = (n-1)/2
即 平均时间复杂度 = O(n)

你可能感兴趣的:(数据结构)