说明:
顺序表的插入操作:insertlist(sqlist &l,int i,int k)//插入函数,形参为引用顺序表,插入位置,插入值。
思路:
进行初始化操作后,进行初试赋值。随后进行插入操作。
插入操作:
需要先给i位置往后的数据后移,腾出i-1的位置,后移完成后,给i-1处赋值为k。
插入操作的时间复杂度:
最好情况:直接插入表尾,O(1);一次成功
最坏情况:插入第一个位置,那么原本n个元素都需要后移,为O(n )
删除操作:
直接后面的元素,补上前一位即可
代码如下:
#include <stdio.h>
#include <malloc.h>
#define initsize 10
typedef struct //定义一个动态顺序表的结构体,并起别名为sqlist
{
int *data; //因为是动态数组,所以先定一个指针,表示数组,后面malloc动态分配即可
int max;
int length;
}sqlist;
bool insertlist(sqlist &l,int i,int k)
{
if(i<1||i>l.length+1)//元素必须挨着,若果插入位置超过当前长度,则无效
return false;
if(l.length>=l.max+1)//如果当前长度超过最大容量,也无效
return false;
int p;
for(p=l.length;p>=i;p--)//从末尾,依次赋值位移
l.data[p]=l.data[p-1];
l.data[i-1]=k;
l.length++;
}
bool deletelist(sqlist &l,int i,int k)
{
if(i<1||i>l.length)
return false;
k=l.data[i-1];
int m;
for(m=i;m<l.length;m++)
{
l.data[m-1]=l.data[m];
}
l.length--;
}
void initlist(sqlist &l)//初始化顺序表操作,并创建动态数组
{
l.data=(int*)malloc(sizeof(int)*initsize);
l.length=0;
l.max=initsize;
}
int main()
{
sqlist l;
initlist(l);
//给顺序表赋初始值
int i;
printf("max=%d\n",l.max);
for(i=0;i<5;i++)
{
l.data[i]=i+1;
l.length++;
printf("%d ",l.data[i]) ;
}
//进行插入操作
insertlist(l,3,3);
int u;
printf("\n");
//验证是否插入成功
printf("插入一个元素 \n");
for(u=0;u<l.length;u++)
{
printf("%d ",l.data[u]);
}
deletelist(l,3,3);
//删除一个元素
printf("删除一个元素\n");
int y;
for(y=0;y<l.length;y++)
{
printf("%d ",l.data[y]);
}
return 0;
}