学习目标:
线性表的实现
学习目录:
- 线性表的初始化
- 线性表的插入
- 线性表的一些其他简单功能
线性表的初始化
typedef int E;
struct content
{
E* arr;
int capacity;
int size;
};
int init_list(struct content* m)
{
m->arr = malloc(sizeof(int) * 10);
if (m->arr == NULL) return 0;
m->capacity = 10;
m->size = 0;
}
解释结构体里的一些数据的作用
E*arr --------------> 目的是开辟一块空间,E的使用是为了后期更改数组类型的方便
capacity-----------> 目的是控制数组的最大空间
size ---------------->目的是了解当前数据存储的位置
对照每一个数据的作用,初始化中的代码将很容易读懂,不再赘述解释
线性表的插入
int insert(struct content* m,int index,int elem)
{
if (index <1 || index > m->size + 1) return 0;
if (m->capacity == m->size)
{
int newcapacity = m->capacity + (m->capacity >> 1);
realloc(m->arr, newcapacity * sizeof(E));
}
for (int i = m->size;i > index - 1;i--)
{
m->arr[i + 1] = m->arr[i];
}
m->arr[index - 1] = elem;
m->size++;
}
解释参数
第一个是一个结构体的指针
第二个是要插入的位置
第三个是要插入的元素
解释代码
第一个if 语句是为了判断index的合法性
第二个if 语句是判断数组是否满了,如果满了将申请一块更大的空间来存放
库函数 realloc 知识的补充
for循环的目的
将要插入的元素位置后面的元素后移
for 循环结束后将index位置赋值给想要的值
这里的数据变常了,所以size ++;
线性表的删除指定位置的元素
int delet(struct content* m, int index)
{
if (index > m->size) return 0;
for (int i = index;i < m->size - 1;i++)
{
m->arr[i] = m->arr[i + 1];
}
}
基本逻辑与插入相同,唯一不同的地方是,移动方向变成了前移
线性表的其他功能
- 求长度
- 获取指定元素的位置
在上面的基础上都相对容易实现,可以自己动手来写写看