typedef struct SeqListPushBack
{
SLDataType* a;//SLDataType表示a的数据类型
int size;
int capacity;
}
void SeqListInit(SL* ps)
{
ps->a=NULL;
ps->size=ps->capacity=0;//初始化表
}
void SeqListDestiry(SL* ps)
{
free(ps->a);
ps->=NULL;
ps->capacity=ps->size=0;//释放表
}
检查空间是否充足
void SeqListCheckCapacity(SL* ps)
{
//如果没有空间或者空间不足
if (ps->size==ps->capacity) //如果ps->size==ps->capacity,说明空间不够
{
int newcapacity=ps->capacity==0?4:ps->capacity*2; //如果原来表的容量为0,则增加4个容量,否则增加两倍的容量
SLDataType* tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));//开辟空间
if (tmp==NULL)
{
printf("realloc fail\n");//如果开辟空间失败,返回失败
exit(-1);//终止程序,不能写成return-1
}
ps->a=tmp;//开辟空间成功的话,
ps->capacity=newcapacity;
}
}
1.尾插法
void SeqListPushBack(SL* ps,SLDataType x)//尾插法
{
//如果没有空间或者空间不足
if (ps->size==ps->capacity) //如果ps->size==ps->capacity,说明空间不够
{
int newcapacity=ps->capacity==0?4:ps->capacity*2; //如果原来表的容量为0,则增加4个容量,否则增加两倍的容量
SLDataType* tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));//开辟空间
if (tmp==NULL)
{
printf("realloc fail\n");//如果开辟空间失败,返回失败
exit(-1);//终止程序,不能写成return-1
}
ps->a=tmp;//开辟空间成功的话,
ps->capacity=newcapacity;
}
ps->a[ps->size]=x;//放入数据
ps->size++;//向后移
}
2.尾删法
void SeqListPopBack(SL* ps)//尾删法
{
//ps->a[ps->size-1]=0;//最后一个元素是size-1,把它置为0,但是如果最后一个数据是0,就多此一举,因此直接执行下面的语句
assert(ps->size>0);//防止ps->size为负越界,判断一下
ps->size--;//向前移动
}
3.头插法
void SeqListPushFront(SL* ps,SLDataType x)
{
//挪动数据
int end=ps->size-1;//数据从最后一个开始整体向后挪动
while(end>=0)
{
ps->a[end+1]=ps->a[end]; //前一个的值赋值给后一个
end--;//向前移动
}
ps->a[0]=x;//把x的值赋给第一个元素
ps->size++;//表的大小加一
}
4.头删法
void SeqListPopFront(SL* ps)
{
assert(ps->0);//表中元素不为0
int begin=1;
while(begin<ps->size)
{
ps->a[begin-1]=ps->a[begin];
++begin;
}
ps->size--;//表的大小减一
}
5.找到数据为x的位置下标,没有找到返回-1
void SeqListFind(SL* ps,SLDataType x)
{
for(int i=0;i<ps->size;i++)
{
if(ps->a[i]==x)
{
return i;
}
}
return -1;
}
6.指定pos下标位置插入
void SeqListInsert(SL* ps,int pos,SLDataType x)
{
if(pos>ps->size||pos<0)
{
printf("pos invalid\n");
return;
}
SeqListCheckCapacity(ps);//防止溢出
int end=ps->size-1;
while(pos<=end)
{
ps->[end+1]=ps->[end];
--end;//end往前移动,直到与pos相等
}
ps->a[pos]=x;//把值赋给pos位置
ps->size++;//大小加一
}
7. 删除pos位置的数据
void SeqListErase(SL* ps,int pos)
{
assert(pos>=0&&pos<ps->size);
int i=pos+1;
while(i<ps->size)
{
ps->a[i-1]=ps->a[i];
++i;
}
ps->size--;//表的大小减一
}