顺序表(C语言实现)
总纲
- 顺序表的声明
- 顺序表的初始化
- 顺序表元素的插入
- 顺序表元素的删除
- 顺序表元素的个数
- 顺序表元素的索引
- 顺序表元素的查找
- 顺序表元素的修改
- 顺序表的销毁
一. 顺序表的声明
因为顺序表中的元素类型可以任意,所以可以用typedef定义一个变量来表示。
因为顺序表有很多属性,但是C语言没有面向对象语言那样的 类和对象 ,但是有一个类似的类型:结构体, 我们可以利用结构体来构造顺序表。
#include <stdio.h>
#include <stdlib.h>
typedef int type; // 用int作为例子
typedef struct arraylist
{
type* arr; // 一个指针,指向顺序表的那个数组
size_t sz; // 当前有多少元素
size_t capacity; // 容量大小
} array; // 同样为了方便,对struct arraylist这种类型重命名一下
二. 顺序表的初始化
先思考一下顺序表初始状态是什么:
- sz为0,因为现在没有任何元素
- capacity不为0,总是有一些容量的
所以初始化顺序表要先去分配一些空间
void initlist(array* list, int capa)// 因为是对顺序表修改,所以穿的是地址
{
list->arr = (type*)calloc(capa,sizeof(type));// 分配capa个空间并初始化为0(个人喜好)
if (list->arr == NULL) return;// 检查一下分配空间是否成功
list->sz = 0; // 当前无元素
list->capacity = capa; // 当前容量确定了
}
三. 顺序表元素的插入
注意每次插入都要进行空间容量的判断,不够的话要扩容
首先检查是否要扩容
void ifEnlarge(array* list)
{
if (list->sz == list->capacity)// 这个时候就需要扩容了
{
int new_cap = list->capacity + list->capacity / 2; // 一般扩容为原来的1.5倍
type* tmp = (type*)realloc(list->arr,new_cap * sizeof(type));
if (tmp != NULL) // 检查是否分配成功
{
list->arr = tmp;
list->capacity = new_cap;
}
else return;
}
}
那么接下来就可以进行插入操作了,注意每次插入都要挪动插入位置后的所有元素
而且需要注意的是需要判断插入位置合不合法
void InsertEle(array* list, type ele, int index)
{
if (index < 0 || index > list->sz)
{
printf("invalid index");
return; // 判断插入位置是否合法
}
for (int i = (list->sz) - 1; i >= index; i--)
{
*((list->arr) + i + 1) = *((list->arr) + i); // for循环挪动元素
}
*((list->arr) + index) = ele; // 这一步用来插入元素
list->sz++; // 元素个数增加1;
}
四. 顺序表元素的删除
元素删除直接把要删除位置后的元素往前移就好了。(注:这个是根据索引删除)
这个也不要忘记判断位置合法不合法。
void DeleteEle(array* list, int index)
{
if (index < 0 || index > list->sz)
{
printf("invalid index");
return; // 判断删除位置是否合法
}
for (int i = index; i < (list->sz) - 1; i++)
{
*((list->arr) + i) = *((list->arr) + i + 1); // 挪动元素
}
list->sz--;
}
五. 顺序表元素的个数
直接返回sz即可
int len(array* list)
{
return list->sz;
}
六. 顺序表元素的索引
根据索引找元素,不要忘了判断位置是否合法
type ListIndex(array* list, int index)
{
if (index < 0 || index > list->sz)
{
return -1;
}
return *((list->arr) + index);
}
七. 顺序表元素的查找
注意这个索引类似于python中的index,只能找到第一个位置
int find(array* list, type ele)
{
for (int i = 0; i < list->sz; i++)
{
if (list->arr[i] == ele)
{
return i;
}
}
return -1;
}
八. 顺序表元素的修改
要把要修改元素的索引,修改后的值传进函数
同时也不要忘记了检查位置是否合法
void SetList(array* list, int index, type ele)
{
if (index < 0 || index > list->sz)
{
printf("invalid index");
return;
}
list->arr[index] = ele;
}
九. 顺序表的销毁
当不使用顺序表时,要销毁申请的空间
void DestroyList(array* list)
{
if (list->arr != NULL)
{
free(list->arr);
list->arr = NULL;
}
}