数据结构-顺序表的增、删、改、查(C语言版)
顺序表是数据结构中最基本的一种线性表,它以一段连续的存储空间来存储数据元素,元素之间的顺序由它们在内存中的位置来决定。在C语言中,我们通常使用数组来实现顺序表。
版本:
/**
* @file name : SequenceList.c
* @brief : 实现顺序表元素的增删改查
* @author : qrshxc@163.com
* @date : 2025/04/07
* @version : 1.0
* @note : 模块化实现
* CopyRight (c) 2025-2026 qrshxc@163.com All Right Reseverd
*/
顺序表的结构定义
首先,我们需要定义一个结构体来表示顺序表,包括数据类型和数据表各项参数等信息:
typedef int DataType_t;
//构造顺序表SquenceList各项参数(顺序表的首地址,容量大小,有效元素最后的下标)
typedef struct SequenceList
{
DataType_t *addr;//记录顺序表首元素地址
unsigned int size;//记录顺序表容量大小
int last;//记录顺序表有效元素最后下标
}SeqList_t;
创建一个空顺序表
创建顺序表并对顺序表进行初始化
/**
* @name SeqList_create
* @brief 创建顺序表并对顺序表进行初始化
* @param size 顺序表的大小
* @return
* @retval manager 顺序表的管理结构体
* @date 2025/04/07
* @version 1.0
* @note Manager->Addr ---> [Size*sizeof(DataType_t)]
*/
SeqList_t *SeqList_create(unsigned size)
{
// 1.利用calloc给管理结构体manager申请一块堆内存
SeqList_t *manager = (SeqList_t *)calloc(1,sizeof(SeqList_t));
//错误处理
if(manager == NULL){
perror("calloc memory for manager is failed!");
exit(-1);//程序异常终止
}
// 利用calloc给顺序表元素申请一块堆内存
manager->addr = (DataType_t *)calloc(size,sizeof(DataType_t));
//错误处理
if(manager->addr == NULL){
perror("calloc memory for addr is failed!");
free(manager);
exit(-1);
}
//2.对顺序表容量大小进行初始化
manager->size = size;
//3.顺序表有效元素最后下标进行初始化(数组第一个元素下标为0)
manager->last = -1;
return manager;
}
顺序表判断
判断顺序表是否已满
/**
* @name SeqList_IsFull
* @brief 判断顺序表是否已满
* @param manager 顺序表的管理结构体
* @return
* @retval true 顺序表已满
* @retval false 顺序表未满
* @date 2025/04/07
* @version 1.0
* @note
*/
bool SeqList_IsFull(SeqList_t *manager)
{
return manager->last+1 == manager->size ? true : false;
}
判断顺序表是否为空
/**
* @name SeqList_IsEmpty
* @brief 判断顺序表是否为空
* @param manager 顺序表的管理结构体
* @return
* @retval true 顺序表空
* @retval false 顺序表不为空
* @date 2025/04/07
* @version 1.0
* @note
*/
bool SeqList_IsEmpty(SeqList_t *manager)
{
return (manager->last == -1) ? true : false;
}
顺序表增加数据
顺序表的插入数据分为头部插入和尾部插入
头部插入
/**
* @name SeqList_HeadAdd
* @brief 往顺序表头部插入元素
* @param data 插入的元素
* @return
* @retval true 添加成功
* @retval false 添加失败
* @date 2025/04/07
* @version 1.0
* @note
*/
bool SeqList_HeadAdd(SeqList_t *manager,DataType_t data)
{
//判断顺序表是否已满
if (SeqList_IsFull(manager))
{
printf("SequenceList is full!\n");
return false;
}
//如果顺序表没满,则所有元素往后挪一位
for (int i = manager->last; i >= 0; i--)
{
manager->addr[i+1] = manager->addr[i];
}
//往顺序表头部加入元素,并更新有效元素下标
manager->addr[0] = data;
manager->last++;
return true;
}
尾部插入
/**
* @name SeqList_TailAdd
* @brief 往顺序表尾部插入元素
* @param data 插入的元素
* @return
* @retval true 添加成功
* @retval false 添加失败
* @date 2025/04/07
* @version 1.0
* @note
*/
bool SeqList_TailAdd(SeqList_t *manager,DataType_t data)
{
//判断顺序表是否已满
if (SeqList_IsFull(manager))
{
printf("SequenceList is full!\n");
return false;
}
//如果没满,则往尾部添加元素
manager->addr[++manager->last] = data;
return true;
}
顺序表删除数据
删除数据之前要判断顺序表是否为空
/**
* @name SeqList_Del
* @brief 往顺序表删除元素
* @param data 插入的元素
* @return
* @retval true 删除成功
* @retval false 删除失败
* @date 2025/04/07
* @version 1.0
* @note
*/
bool SeqList_Del(SeqList_t *manager,DataType_t DestVal)
{
//1.判断顺序表是否为空
if (SeqList_IsEmpty(manager))
{
printf("SequenceList is empty!\n");
return false;
}
int pos = -1;
// 查找目标值的位置
for (int i = 0; i <= manager->last; i++) {
if (manager->addr[i] == DestVal) {
pos = i;
break;
}
}
//没有目标值
if (pos == -1) {
printf("DestVal not found!\n");
return false;
}
//有目标值
// 删除元素:后面的元素前移
for (int i = pos; i < manager->last; i++) {
manager->addr[i] = manager->addr[i + 1];
}
manager->last--; // 更新有效元素下标
return true;
}
顺序表的修改
修改顺序表中指定位置的元素
/**
* @name SeqList_Update
* @brief 修改顺序表中指定位置的元素
* @param pos 要修改的位置(下标)
* @param NewData 新的元素值
* @return
* @retval true 修改成功
* @retval false 修改失败
* @date 2025/04/09
* @version 1.0
* @note 位置范围:0 ≤ pos ≤ manager->last
*/
bool SeqList_Update(SeqList_t *manager, int pos, DataType_t NewData)
{
// 1. 判断顺序表是否为空
if (SeqList_IsEmpty(manager))
{
printf("SequenceList is empty!\n");
return false;
}
// 2. 检查位置是否有效
if (pos < 0 || pos > manager->last)
{
printf("Invalid position!\n");
return false;
}
// 3. 修改指定位置的元素
manager->addr[pos] = NewData;
return true;
}
顺序表的查询
从头到尾遍历顺序表的元素
/**
* @name SeqList_Print
* @brief 从头到尾遍历顺序表的元素
* @param manager 顺序表的管理结构体
* @return
* @retval
* @date 2025/04/08
* @version 1.0
* @note
*/
void SeqList_Print(SeqList_t *manager)
{
for (int i = 0; i <= manager->last; ++i)
{
printf("Element[%d] = %d\n", i, manager->addr[i]); // 打印顺序表单元数据
}
}
函数销毁
/**
* @name SeqList_destroy
* @brief 函数销毁
* @param manager 顺序表的管理结构体
* @return
* @date 2025/04/08
* @version 1.0
* @note
*/
void SeqList_destroy(SeqList_t *manager) {
if (manager) {
free(manager->addr);
free(manager);
}
}
测试及结果
int main(int argc, char const *argv[])
{
SeqList_t *manager = SeqList_create(10); // 创建容量为10的顺序表
// 测试尾插
SeqList_TailAdd(manager, 10);
SeqList_TailAdd(manager, 20);
SeqList_TailAdd(manager, 30);
// 测试头插
SeqList_HeadAdd(manager, 5);
printf("顺序表插入后的内容:\n");
SeqList_Print(manager); // 打印插入后的顺序表
// 测试修改
SeqList_Update(manager, 2, 99); // 将下标为2的元素修改为99
printf("\n修改下标为2的元素后的顺序表内容:\n");
SeqList_Print(manager); // 打印修改后的顺序表
// 测试删除
SeqList_Del(manager, 20);
printf("\n删除元素 20 后的顺序表内容:\n");
SeqList_Print(manager); // 打印删除后的顺序表
// 释放内存
SeqList_destroy(manager);
return 0;
}
结果
顺序表插入后的内容:
Element[0] = 5
Element[1] = 10
Element[2] = 20
Element[3] = 30
修改下标为2的元素后的顺序表内容:
Element[0] = 5
Element[1] = 10
Element[2] = 99
Element[3] = 30
DestVal not found!
删除元素 20 后的顺序表内容:
Element[0] = 5
Element[1] = 10
Element[2] = 99
Element[3] = 30
通过以上实现,我们可以在C语言中创建、插入、删除和查找顺序表中的元素。顺序表的简单实现不仅有助于理解数据结构的基本概念,还可以为解决实际问题提供基础。 顺序表作为线性表的开头部分,对于我们后续学习数据结构中还是很重要的,需要我们把它学好,本篇文章也只是点了一下知识点并给出少许例子,更多的知识还需要我们自己去探索学习!

浙公网安备 33010602011771号