数据结构之静态线性表怎么插入和删除(附代码)
一、插入
#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]);
}
}