上期我们讲了顺序表的尾插、头插、尾删、头删,接下来我们继续讲关于顺序表的其他操作,来彻底把顺序表讲明白。在最后我会把整个顺序表的代码都附上。
3.9 顺序表在指定位置之前插入数据
void SLInsert(SL *ps ,int pos,SLDataType x)
{
assert(ps);
assert(pos>=0&&pos<ps->size);
SLCheckCapacity(ps);
for(int i=ps->size;i>pos;i--)
{
ps->arr[i]=ps->arr[i-1];
}
ps->arr[pos];
ps->size++;
}
我们自己在写代码的时候,需要注意for循环中i的结束条件,我建议大家可以自己画个图,再带入条件自然就出来了。
3.10 在顺序表中删除某个位置的数据
void SLErase(SL *ps,int pos)
{
assert(ps);
assert(pos>=0&&pos<ps->size);
for(int i=pos;i<ps->size-1;i++)
{
ps->arr[i]=ps->arr[i+1];
}
ps->size--;
}
3.11 在顺序表中查找某个数据
int SLFind(SL* ps,SLDataType x)
{
assert(ps);
for(int i=0;i<ps->size;i++)
{
if(ps->arr[i]==x)
return i;
}
printf("没有找到!");
return -1;
}
这些大概就是所有顺序表的内容,下面我把整个顺序表的代码放到下面
Seqlist.c:
#include"Seqlist.h"
void SLInit(SL* ps)
{
assert(ps);
ps->arr=NULL;
ps-> capacity=ps->size=0;
}
void SLDestroy(SL* ps)
{
assert(ps);
free(ps->arr);
ps->arr=NULL;
ps->capacity=ps->size=0;
}
void SLPrint(SL s)
{
for(int i=0;i<s.size;i++)
{
printf("%d ",s.arr[i]);
}
printf("\n");
}
void SLCheckCapacity(SL *ps)
{
if(ps->capacity==ps->size)
{
int NewCapacity=ps->capacity==0?4:2*ps->capacity;
SLDataType * tmp=(SLDataType*)realloc(ps->arr,NewCapacity*sizeof(SLDataType));
if(tmp==NULL)
{
perror("realloc fail");
exit(1);
}
ps->arr=tmp;
ps->capacity=NewCapacity;
}
}
void SLPushBack(SL *ps,SLDataType x)
{
//温柔的方式
// if(ps==NULL)
// {
// return ;
// }
//或者直接assert
assert(ps);
// if(ps->capacity==ps->size)
// {
// int NewCapacity=ps->capacity==0?4:2*ps->capacity;
// SLDataType * tmp=(SLDataType*)realloc(ps->arr,NewCapacity*sizeof(SLDataType));
// if(tmp==NULL)
// {
// perror("realloc fail");
// exit(1);
// }
// ps->arr=tmp;
// ps->capacity=NewCapacity;
// }
SLCheckCapacity(ps);
ps->arr[ps->size++]=x;
}
void SLPushFront(SL*ps ,SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
for(int i=ps->size;i>=0;i--)
{
ps->arr[i]=ps->arr[i-1];
}
ps->arr[0]=x;
ps->size++;
}
void SLPopBack(SL* ps)
{
assert(ps);
assert(ps->size);
--ps->size;
}
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size);
for(int i=0;i<ps->size-1;i++)
{
ps->arr[i]=ps->arr[i+1];
}
--ps->size;
}
void SLInsert(SL *ps ,int pos,SLDataType x)
{
assert(ps);
assert(pos>=0&&pos<ps->size);
SLCheckCapacity(ps);
for(int i=ps->size;i>pos;i--)
{
ps->arr[i]=ps->arr[i-1];
}
ps->arr[pos];
ps->size++;
}
void SLErase(SL *ps,int pos)
{
assert(ps);
assert(pos>=0&&pos<ps->size);
for(int i=pos;i<ps->size-1;i++)
{
ps->arr[i]=ps->arr[i+1];
}
ps->size--;
}
int SLFind(SL* ps,SLDataType x)
{
assert(ps);
for(int i=0;i<ps->size;i++)
{
if(ps->arr[i]==x)
return i;
}
printf("没有找到!");
return -1;
}
Seqlist.h:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
//动态顺序表
typedef struct SeqList
{
SLDataType * arr;
int size;//有效数据的个数
int capacity;//空间大小
}SL;
void SLInit(SL *ps);
void SlDestroy(SL * ps);
void SLCheckCapacity(SL *ps);
void SLPrint(SL s);
void SLPushBack(SL * ps,SLDataType x);
void SLPushFront(SL* ps,SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
void SLInsert(SL*ps ,int pos,SLDataType x);
void SLErase(SL* ps,int pos);
int SLFind(SL*ps ,SLDataType x);
test.c: 这个就是测试你写的功能对不对,可以自己测试各个函数的功能!
#include"Seqlist.h"
void test01()
{
SL T;
SLInit(&T);
SLPushBack(&T,3);
SLPushBack(&T,4);
SLPushBack(&T,6);
SLPushBack(&T,9);
SLPrint(T);
SLErase(&T,2);
int m=SLFind(&T,9);
printf("%d",m);
}
int main()
{
test01();
return 0;
}
接下来我会继续更新数据结构的知识,下一个专题就到链表啦!