顺序表:数据元素之间的逻辑关系是相邻的,并且内存地址也是相邻的,使用一组内存地址连续的内存单元来依次存储线性表中的数据元素,如数组和匿名的数组(堆内存)。通常用户使用动态分配的数组来实现顺序表,也就是使用堆内存实现。随机访问指的是在同等时间内有访问任意元素的能力,对立的是顺序访问。
1. 结构体类型
typedef int DataType_t;
typedef struct {DataType_t *data; //数据数组unsigned int size; //数组容量int index; //当前已使用的元素个数(索引)
} Sqlist_t;
2.创建顺序表
Sqlist_t* Sqlist_create(unsigned int size)
{Sqlist_t *manage=(Sqlist_t *)calloc(1,sizeof(Sqlist_t));if(!manage){perror("calloc manage failed");return NULL;}manage->data=(DataType_t *)calloc(size,sizeof(DataType_t));if(!manage->data){perror("calloc data failed");free(manage);return NULL;}manage->size=size;manage->index=-1; //初始索引用 -1 表示空列表return manage;
}
3.添加元素
- 尾插
bool Sqlist_AddTail(Sqlist_t *list,DataType_t value)
{if(list->index+1>=list->size){ //如果顺序表满则直接退出printf("list is full\n");return false;}list->data[++list->index]=value; //插入新元素return true;
}
- 头插
bool Sqlist_AddHead(Sqlist_t *list,DataType_t value)
{if(list->index+1>=list->size){ //如果顺序表满则直接退出printf("list is full\n");return false;}for(int i=list->index;i>=0;i--){ //将所有元素后移一位list->data[i+1]=list->data[i];}list->data[0]=value;list->index++;
}
4.删除元素
- 指定值删除
bool Sqlist_Del(Sqlist_t *list,DataType_t value)
{if(list->index == -1){ //顺序表为空printf("list is empty\n");return false;}int index=-1; //记录该值所在位置下标 for(int i=0;i<=list->index;i++){if(list->data[i]==value){index=i;break;}}if(index==-1){printf("value not found\n");return false;}for(int i=index;i<list->index;i++){ //左移一位覆盖删除值list->data[i]=list->data[i+1];}list->index--;return true;
}
- 指定下标删除
bool Sqlist_DelIndex(Sqlist_t *list,unsigned int index)
{if(list->index == -1){ //顺序表为空printf("list is empty\n");return false;}for(int i=index;i<list->index;i++){ //左移一位覆盖删除值list->data[i]=list->data[i+1];}list->index--;return true;
}
5.遍历顺序表
void Sqlist_Print(Sqlist_t *list)
{if(list->index == -1){printf("list is empty\n");return;}for(int i=0;i<=list->index;i++){printf("%d ",list->data[i]);}
}
