文章目录
1.顺序表的概念和结构
1.1 线性表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构。常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上不一定是连续的。线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表:逻辑结构是线性的,物理结构是连续的
顺序表的
2.顺序表和数组的区别
顺序表的底层结构是数组,对数组的封装实现了常用的增删改查等接口
顺序表功能更丰富
2.1静态顺序表:使用定长数组存储元素
数组 | 顺序表
给定长度的数组:int arr[100]----------->静态顺序表
动态设置数组长度:int* arr;------------->动态顺序表
SeqList.h
:定义顺序表的结构,顺序表要实现的接口/方法
SeqList.c
:具体实现顺序表里定义的接口/方法**
test.c
: 测试动作:测试顺序表
静态顺序表:给定的数组长度,若不够,会导致后续的数据保存失败。给多了,导致空间大量浪费
3. 动态顺序表的实现
3.1 定义顺序表
typedef int SListDataType;
struct SeqList*{
SLDatatype *arr;//存储数据的底层结构
int size;//记录顺序表的空间大小
int capacity;//有效数据个数
};
3.2顺序表的初始化
#include"SeqList.h"
void SqInit(SL *ps){
ps->arr=NULL;
s->size=s->capacity=0;
}
3.3顺序表的插入
realloc
:对已有空间增加空间大小。
calloc
:要初始化
void SLPushBack(SL *ps,SLDataType x){
ps->arr[ps->size++]=x;
}
3.4 扩容: 空间不够,扩容
void SLCheckCapacity(SL *ps,SLDatatype x){
if(ps->size==ps-capacity){
int newcapacity=ps->capacity==0?4:2*ps->capacity;
SLDataType *tmp=(SLDataType*)realloc(ps->arr,sizeof(SLDataType)*newcapacity);
if(tmp==NULL){
printf("realloc failed!");
exit(-1);
}
//扩容成功
free(arr);
ps->arr=tmp;
ps->capacity=newcapacity;
}
}
3.5尾插
void PushBack(SL *ps,SLDataType x){
//空间足够,直接插入
ps->arr[ps->size++]=x;
}
3.6测试头插
PushBack(&s1,1);
PushBack(&s1,2);
PushBack(&s1,3);
PushBack(&s1,4);
SLPrint(&s1);
3.7尾删
顺序表为空-不能执行删除
顺序表不为空-删除最后一个有效数据。size–;
void PopBack(SL *ps){
assert(ps);
assert(ps->size);
//顺序表不为空
ps->size--;
}
3.8头删
顺序表为空-不执行删除操作
顺序表不为空-后面的数据往前挪动一位,size–
void PopFront(SL *ps){
assert(ps);
assert(ps->size);
for(int i=0;i<ps->size-1;i++){
ps->arr[i]=ps->arr[i+!];
ps->size--;
}
}
3.9在指定的位置之前插入数据
void SLInsert(SL *ps,,int pos,SLDataType x){
assert(ps);
SLcheackCapacity(ps);
assert(ps>=0&&ps<=ps->size);
//pos及之后的数据往后挪一位,pos空出来
for(int i=ps->size;i>pos;i--){
ps->arr[i]=ps->arr[i-1];
ps->arr[pos]=x;
ps->szie++;
}
}
3.10删除指定位置数据
void Erease(SL *ps,int pos){
assert(ps);
assert(ps->0&&ps->size);
//pos后面的数据往前挪动一位
for(int i=pos;i<ps->size-1;i++){
ps->arr[i]=ps->arr[i+1];
ps->size--;
}
}
3.11在顺序表中查找
void SLFind(SL *ps,SLDataType x){
for(int i=0;i<ps->size;i++){
if(ps->arr[i]==x){
return i;
}
}
return -1;
}