表现形式
顺序表主要的表现形式就是数组的形式
链表主要表现形式是指针的形式
typedef int SQdataTYpe;
typedef struct Sqlist{
SQdataType *a;
int size;
int capacity;
}SL;
存储方式
顺序表的存储形式是随机存储
链表的存储形式则是顺序存储
所以对于顺序表而言,链表在中间的插入和删除的操作时间复杂度为O(n),而顺序表插入和删除操作的时间复杂度为O(n^2);对于链表而言,查找时需要从头遍历一遍链表,来找到对应的元素,而顺序表可以直接找到对应元素或位置,不需要遍历。
基本操作
顺序表的基本操作有初始化、前插、后插、前删、后删、随机插入、随机删除等。
1.初始化
void InitSqlist(SL*s){
s->a=NULL;
s->size=0;
s->capacity=0;
}
void SqlistcheckCapacity(SL*s){
if(s->size==s->capacity){
int newcapacity=s->capacity==0?4:s->capacity*2;
SQdataType*t=(SQdataType*)realloc(s->a,newcapacity*2*sizeof(SQdataType));
if(t==NULL){
printf("realloc failed.\n");
exit(-1);
}
else{
s->a=t;
s->capacity=newcapacity;
}
}
}
2.前插
void InsertSqlistfront(SL*s,SQdataType x){
SqlistcheckCapacity(s);
int end=s->size-1;
while(end>=0){
s->a[end+1]=s->a[end];
--end;
}
s->a[0]=x;
s->size++;
}
3.后插
void InsertSqlistback(SL*s,SQdataType x){
SqlistcheckCapacity(s);
s->a[s->size]=x;
s->size++;
}
4.前删
void DeleteSqlistfront(SL*s){
assert(s->szie>0);
int start=1;
while(start<s->size){
s->a[start-1]=s->a[start];
start++;
}
s->size--;
}
5.后删
void DeleteSqlistback(SL*s){
assert(s->size>0);
s->size--;
}
6.随机删除
void DeleteSqlist(SL*s,int pos){
assert(s->size>0);
SqlistcheckCapacity(s);
int start=pos+1;
while(start<s->size){
s->a[start-1]=s->a[start];
++start;
}
s->size++;
}
7.随机插入
void InsertSqlist(SL*s,int pos,SQdataType x){
SqlistcheckCapacity(s);
int start=pos+1;
while(start<s->size){
s->a[start+1]=s->a[start];
start++;
}
s->a[pos]=x;
s->size++;
}