顺序表的基本操作
插入
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10 //定义最大长度
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
void InitList(SeqList &L){
L.data = (int*)malloc(sizeof(int)*InitSize);
L.length=0;
L.MaxSize=InitSize;
for(int i=0;i<L.MaxSize;i++){//赋初值
L.data[i]=0;
}
int a;
int i=0;
while(1){//录入数据
if(L.length==L.MaxSize){
break;
}
printf("请输入一个整数(输入负数结束):");
scanf("%d",&a);
if(a<0){
break;
}
L.data[i]=a;
L.length++;
i++;
}
}
void dispaly(SeqList L){//遍历数组
printf(" ");
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
bool insertList(SeqList &L,int i,int e){
if(i<1||i>L.length+1)//位序合法值的判断
return false;
if(L.length>=L.MaxSize)
return false;
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
int main(){
int index,e;
SeqList L;
InitList(L);
dispaly(L);
printf("请输入要插入的位置:");
scanf("%d",&index);
printf("请输入要插入的数值:");
scanf("%d",&e);
insertList(L,index,e);
dispaly(L);
return 0;
}
最好情况:新元素插入到表尾,不需要移动元素
i=i+1,循环0次:最好时间复杂度 = O(1)
最坏情况:新元素插入到表头,需要将原有的n个元素全部向后移动
i=i+1,循环n次:最坏时间复杂度 = O(n)
平均情况:假设新元素插入到任何一个位置的概率相同,即i=1,2,3,…,length+1的概率都是p=1/(n+1)
i=1,循环n次;
i=2,循环n-1次;
i=3,循环n-2次;…… i=n+1时,循环0次
平
均
循
环
次
数
=
n
p
+
(
n
−
1
)
p
+
…
…
+
1
∗
p
=
[
n
(
n
+
1
)
/
2
]
∗
1
/
(
n
+
1
)
=
n
/
2
平均循环次数 = np + (n-1)p + …… + 1*p =[n(n+1)/2]*1/(n+1)=n/2
平均循环次数=np+(n−1)p+……+1∗p=[n(n+1)/2]∗1/(n+1)=n/2
平均时间复杂度=O(n)
删除
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10 //定义最大长度
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
void InitList(SeqList &L){
L.data = (int*)malloc(sizeof(int)*InitSize);
L.length=0;
L.MaxSize=InitSize;
for(int i=0;i<L.MaxSize;i++){//赋初值
L.data[i]=0;
}
int a;
int i=0;
while(1){//录入数据
if(L.length==L.MaxSize){
break;
}
printf("请输入一个整数(输入负数结束):");
scanf("%d",&a);
if(a<0){
break;
}
L.data[i]=a;
L.length++;
i++;
}
}
void dispaly(SeqList L){//遍历数组
printf(" ");
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
bool insertList(SeqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(L.length>=L.MaxSize)
return false;
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
bool ListDelete(SeqList &L,int i,int &e){//e为引用值
if(i<1||i>L.length) //位序合法值的判断
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
int main(){
int index,e;
SeqList L;
InitList(L);
dispaly(L);
printf("请输入要插入的位置:");
scanf("%d",&index);
printf("请输入要插入的数值:");
scanf("%d",&e);
insertList(L,index,e);
dispaly(L);
e=-1;
if(ListDelete(L,3,e))//引用类型,e的值改变
printf("已删除第三个元素,删除的元素值为=%d\n",e);
else
printf("位序不合法\n");
dispaly(L);
return 0;
}
最好情况:删除表尾元素,不需要移动其他元素
i=n,循环0次;最好时间复杂度 = O(1)
最坏情况:删除表头元素,需要将后续的n-1个元素全部都向前移动
i=1,循环n-1次;最快时间复杂度 = O(n)
平均情况:假设删除任何一个元素的概率相同,即i=1,2,3,…,length的概率都是p=1/n
i=1,循环n-1次;
i=2,循环n-2次;
i=3,循环n-3次;…… i=n时,循环0次
平
均
循
环
次
数
=
(
n
−
1
)
p
+
(
n
−
2
)
p
+
…
…
+
1
∗
p
=
[
n
(
n
−
1
)
/
n
]
∗
1
/
n
=
(
n
−
1
)
/
2
平均循环次数=(n-1)p+(n-2)p+……+1*p=[n(n-1)/n]*1/n=(n-1)/2
平均循环次数=(n−1)p+(n−2)p+……+1∗p=[n(n−1)/n]∗1/n=(n−1)/2
平均时间复杂度=O(n)