顺序表的基本操作:
一下代码展示的是顺序表的 插入删除查找操作以及时间复杂度的分析和一些注释
1.顺序表的插入操作
bool ListInsert(SqList &L,int L,int e) //顺序表的插入操作
{
if(i<1||i>L.length+1)
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 true;
}
int place;
ElemType e;//使用ElemTyoe 是因为插入的数据类型不知道是哪一种
printf("请输入要插入的位置(从1开始)和元素:\n");
scanf("%d %d",&place,&e);
bool flag;
if (flag)
{
printf("插入成功!!!\n");
PrintList(L);
}
}
/* 对时间复杂度的分析
最好情况 插入在顺序表的表尾
时间复杂度为=O(1)
最坏情况 插入在顺序表的表头
时间复杂度为=O(n)
平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n+1
假设i=1 循环n次;i=2时循环n-1次;i=n+1时循环0次
平均时间复杂度=np+(n-1)p+(n-2)p+...+1p=n/2
*/
2.顺序表的删除操作
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++) //for循环 是将第i个位置后的元素前移
{
L.data[j-1]=L.data[j];
L.length--; //线性表的长度减1
}return true;
int e=-1;
scanf("%d",&i);
if(ListDelete(L,i,e))
printf("已删除第i个元素,删除的元素值为=%d\n",e);
else
printf("位序i不合法 删除失败");
}
/* 时间复杂度分析
最好情况删除的表尾元素,其他的元素不用移动
时间复杂度为O(1)
最坏情况 删除的表头元素,其他元素都得移动
时间复杂度为O(n)
平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n
i=1 循环n-1次;i=2时循环n-2次 i=n时 循环0次
平均循环=(n-1)p+(n-2)p+...+p=(n-1)/2
*/
3.顺序表的查找操作
bool LocateElem(SqList L, ElemType e)
{
if(i<1||i>MaxSize)
return false;
for (int i = 0; i<L.length; i++)//从低位置查找
{
if (L.data[i] == e)
return i + 1; //数组下表为i的元素值为e 返回其位序i+1
}
return 0; //退出循环 说明查找失败
}
//查找函数对时间复杂度的分析
/* 最好情况:目标元素在表头
循环一次 最好的时间复杂度=O(1)
最坏情况:目标元素在表尾
循环n次:最坏时间复杂度=O(n)
平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n
目标元素在第一位 循环1次 第二位循环2次 第n位循环n次
平均循环次数=1*1/n+2*1/n+...+n*1/n=(n+1)/2
*/