数据结构学习之顺序表

顺序表(C语言实现)

总纲

  1. 顺序表的声明
  2. 顺序表的初始化
  3. 顺序表元素的插入
  4. 顺序表元素的删除
  5. 顺序表元素的个数
  6. 顺序表元素的索引
  7. 顺序表元素的查找
  8. 顺序表元素的修改
  9. 顺序表的销毁

一. 顺序表的声明

因为顺序表中的元素类型可以任意,所以可以用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这种类型重命名一下 

二. 顺序表的初始化

先思考一下顺序表初始状态是什么:

  1. sz为0,因为现在没有任何元素
  2. 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;
    }
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值