数据结构:线性表、动态数组(C语言实现)

#include<stdio.h>
#include<stdlib.h>

typedef int Dt; // 定义数据类型

typedef struct List
{
    Dt* array;        // 用于存储元素的数组
    Dt m_capacity;    // 数组的容量
    Dt m_size;        // 列表当前的大小(元素个数)
} LIST, *PLIST;

// 初始化列表
_Bool Init_List(PLIST list)
{
    list->array = malloc(sizeof(Dt) * 10);  // 分配初始容量为10的数组内存
    if (list->array == NULL)
    {
        return 0;  // 内存分配失败
    }
    list->m_capacity = 10;  // 设置数组的容量为10
    list->m_size = 0;      // 列表初始大小为0,表示列表中没有元素
    return 1;              // 初始化成功
}

// 在指定索引处插入元素
_Bool Insert_List(PLIST list, int index, Dt value)
{
    if (index < 1 || index > list->m_size + 1)
    {
        return 0;  // 无效的索引,索引必须在有效范围内
    }
    if (list->m_size == list->m_capacity)
    {
        // 如果列表已满,需要重新分配更大的内存空间来容纳更多的元素
        int newcapacity = list->m_capacity + (list->m_capacity >> 1);  // 增加容量50%
        Dt* newarray = realloc(list->array, newcapacity * sizeof(Dt));  // 重新分配内存空间
        if (newarray == NULL)
        {
            return 0;  // 内存分配失败
        }
        list->array = newarray;  // 更新数组指针
        list->m_capacity = newcapacity;  // 更新容量
    }

    // 将指定索引及之后的元素向后移动一位,为新元素腾出空间
    for (int i = list->m_size; i > index - 1; i--)
    {
        list->array[i] = list->array[i - 1];
    }
    
    list->array[index - 1] = value;  // 在指定索引处插入新元素
    list->m_size++;  // 更新列表的大小
    return 1;  // 插入成功
}

// 删除指定索引处的元素
_Bool Delete_List(PLIST list, int index)
{
    if (index < 1 || index > list->m_size)
    {
        return 0;  // 无效的索引,索引必须在有效范围内
    }
    
    // 将指定索引之后的元素向前移动一位,覆盖掉待删除的元素
    for (int i = index - 1; i < list->m_size - 1; i++)
    {
        list->array[i] = list->array[i + 1];
    }
    
    list->m_size--;  // 更新列表的大小,减去一个元素
    return 1;  // 删除成功
}

// 打印列表中的元素
void Print_List(PLIST list)
{
    for (int i = 0; i < list->m_size; i++)
    {
        printf("%d ", list->array[i]);
    }
    printf("\n");
}

// 获取列表的大小(元素个数)
int Get_Listsize(PLIST list)
{
    return list->m_size;
}

// 获取指定索引处的元素的值
Dt* Get_Listdata(PLIST list, int index)
{
    if (index < 1 || index > list->m_size)
    {
        return NULL;  // 无效的索引,索引必须在有效范围内
    }
    return &list->array[index - 1];  // 返回指向指定索引处元素的指针
}

// 查找元素在列表中的索引
int Find_Listdata(PLIST list, Dt value)
{
    for (int i = 0; i < list->m_size; i++)
    {
        if (value == list->array[i])
        {
            return i + 1;  // 找到元素,返回索引(从1开始)
        }
    }
    return -1;  // 元素不在列表中,返回-1
}

int main()
{
    LIST list;
    Init_List(&list);  // 初始化列表

    // 向列表中插入元素
    for (int i = 0; i < 20; i++)
    {
        Insert_List(&list, i, i * 10);
    }

    // 打印列表
    Print_List(&list);

    // 删除指定索引处的元素
    Delete_List(&list, 1);

    // 打印列表
    Print_List(&list);

    // 获取列表的大小(元素个数)
    printf("列表大小为:%d\n", Get_Listsize(&list));

    // 获取指定索引处的元素的值
    printf("第2个元素为:%d\n", *Get_Listdata(&list, 2));

    // 查找元素在列表中的索引
    printf("20在列表中的索引为:%d\n", Find_Listdata(&list, 20));

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值