数据结构之静态线性表怎么插入和删除(附代码)

数据结构之静态线性表怎么插入和删除(附代码)

一、插入

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 5
typedef struct{
	int data[Maxsize];
	int length;
}student,*studentInfo;
//表示定义一个结构体student。

void InitList(student &L) {//这里需要取地址。
	for (int i = 0; i < Maxsize; i++) {
		L.data[i] = 0;
	}
	L.length = Maxsize;
}//初始化线性表

bool InitInster(student &L,int i,int e){
	if (i<1 && i>L.length + 1) return false;//输入的i的位置不合法,不同意输入所以返回false;这也是用bool类型的原因
	if (i > Maxsize)return false;//内存不够,无法继续分配,之前说过静态分配无法增加空间。
	for (int j = L.length; j>=i; j--) {
		L.data[j] = L.data[j - 1];
	}//循环使得后一个的元素不断向后,使得L.data[i1]可以空出来。
	L.data[i-1] = e;
	return true;
}//在位置e插入i

int main() {
	student L;
	InitList(L);
	for (int i = 0; i < L.length; i++) {
		scanf("%d",&L.data[i]);
	}//逐个输入
	InitInster(L, 3, 5);
	for (int j = 0; j < L.length; j++) {
		printf("%d ", L.data[j]);//这里输出%d后面加了一个空格
	}//逐个输出
}

输出结果如下:

在这里插入图片描述

(1).时间复杂度

最好的时间复杂度是O(1),表示插入第一个,不用循环

最坏的时间复杂度是O(n),表示插入最后一个,需要循环到最后

平均是复杂度也是O(n),因为一共是n+1个数(最开始n个+后面插入的一个),所以概率是p=1/(n+1),所以每个被插入的概率是(n-1)p+(n-2)p+…+p = (n-1)/2,所以时间复杂度也是O(n);
同理下面的删除复杂度与上面一样。

二、删除

bool ListDelete(student& L, int i, int &e) {
	if (i<1 && i>L.length + 1) return false;//和上面一样表示i的位置不合法
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++){
		L.data[j - 1] = L.data[j];
	}
	return true;
}//表示删除位置i的数字e

整体代码如下:

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 5
typedef struct{
	int data[Maxsize];
	int length;
}student,*studentInfo;


void InitList(student &L) {
	for (int i = 0; i < Maxsize; i++) {
		L.data[i] = 0;
	}
	L.length = Maxsize;
}
bool InitInster(student &L,int i,int e){
	if (i<1 && i>L.length + 1) return false;//i的位置不合法
	if (i > Maxsize)return false;//内存不够
	for (int j = L.length; j>=i; j--) {
		L.data[j] = L.data[j - 1];
	}
	L.data[i-1] = e;
	return true;
}//在位置e插入i

bool ListDelete(student& L, int i, int &e) {
	if (i<1 && i>L.length + 1) return false;//和上面一样表示i的位置不合法
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++){
		L.data[j - 1] = L.data[j];
	}
	return true;
}//表示删除位置i的数字e

int main() {
	student L;
	InitList(L);
	for (int i = 0; i < L.length; i++) {
		scanf("%d",&L.data[i]);
	}
	int e;
	ListDelete(L, 3, e);
	for (int j = 0; j < L.length; j++) {
		printf("%d ", L.data[j]);
	}
}
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庄小胖努力加油中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值