#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;
}
数据结构:线性表、动态数组(C语言实现)
于 2023-07-14 20:54:15 首次发布