前言
顺序表的基本操作主要有删除,插入和查找
一、插入
代码
#define MaxSize 10
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; //顺序表初始长度为0
}
}
bool Insertlist(Sqlist&L,int i,int e){ //在L的位序i处插入元素e
if(i<1||i>L.length+1) //判断i的范围是否有效
return false;
if(L.length>=MaxSize) //当前存储空间已经满了,不能在插入
return false;
for(int j=L.length;j>=i;j--){ //将第i个元素及之后的元素后移
L.data[j]=L.data[j-1]; //注意位序、数组下标的关系,并从后面的元素依次移动
L.data[i-1]=e; //在位置i处放入元素e
L.length++; //长度加1
return ture;
}
}
int main(){
Sqlist L;
Initlist(L);
//此处在顺序表中插入几个元素(略)
Insertlist(L,3,3); 在位序为3的位置插入3
return 0;
}
时间复杂度
(1)最好情况:在表尾插入(即i=n+1),元素后移语句将不执行,则为O(1);
(2)最坏情况:在表头插入(即i=1),元素后移将执行n次,则为O(n);
(3)平均情况:平均次数为n/2,则为O(n);
二、删除
代码
#define MaxSize 10
#include<stdio.h>
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 ListDelete(Sqlist &L,int i,int &e){
if(i<1||i>L.length){
return false;
}
e=L.data[i-1]; //将被删除的元素赋值给e
for(int j=i;j<=L.length;j++){
L.data[j-1]=L.data[j];
L.length--;
return true;
}
}
int main(){
Sqlist L;
Initlist(L);
//此处省略一些代码,插入几个元素
int e=-1; //用变量e把删除的元素“带回来”
if(ListDelete(L,3,e))
printf("已删除第3个元素,删除元素值为=%d\n",e);
else
printf("位序i不合法,删除失败\n");
return 0;
}
时间复杂度
(1)最好情况:在表尾删除(即i=n),元素前移语句将不执行,则为O(1);
(2)最坏情况:在表头删除(即i=1),需移动除表头元素以外的所有元素,需循环n-1次,则为O(n);
(3)平均情况:平均次数为n-1/2,则为O(n);
三、查找
按位查找
//GetElem(L,i) 获取位序为i的元素的值
//静态分配情况
#define Maxsize 10
typedef struct{
ElemType data[Maxsize];
int length;
}Sqlist;
ElemType Getelem(Sqlist L,int i){
return(L.data[i-1]);
}
//GetElem(L,i) 获取位序为i的元素的值
//动态分配情况
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data;
int length;
int MaxSize;
}Seqlist;
ElemType Getelem(Seqlist L,int i){
return(L.data[i-1]); //和访问普通数组方法一样
}
时间复杂度
由于顺序表各个数据元素在内存中连续存放,可以根据起始地址和数据元素大小立即找到第i个元素,具有随机存取特性,故为O(1);
按值查找
//LocateElem(L,e) 获取值为e的元素
//动态分配情况
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data;
int length;
int MaxSize;
}Seqlist;
ElemType LocateElem(Seqlist L,ElemType e){
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
//==在基本数据类型为int,char,double,float等可以直接运用运算符“==”比较
//结构类型的数据元素比较方法,即需要依次对比各个分量来判断两个结构体是否相等
return i+1; //数组下标为i的元素值等于e,返回其位序i+1
return 0;
}
时间复杂度
(1)最好情况:O(1);
(2)最坏情况:O(n);
(3)平均情况:平均次数为n+1/2,则为O(n);
总结
插入元素时,元素向着表尾方向依次向后移动
删除元素时,元素向着表头方向依次向前移动