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

Posted _大木_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之顺序表的插入删除操作(静态分配实现)及其时间复杂度分析相关的知识,希望对你有一定的参考价值。

文章目录

1.顺序表的插入操作

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

#include<stdio.h>
#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<stdio.h>
#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)

以上是关于数据结构之顺序表的插入删除操作(静态分配实现)及其时间复杂度分析的主要内容,如果未能解决你的问题,请参考以下文章

线性表之顺序存储-顺序表

数据结构之顺序表和链表的比较

(王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)

数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初

数据结构从零实现顺序表+链表相关操作

数据结构之顺序表的增删查改等操作详解