数据结构-顺序表的增、删、改、查(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语言中创建、插入、删除和查找顺序表中的元素。顺序表的简单实现不仅有助于理解数据结构的基本概念,还可以为解决实际问题提供基础。 顺序表作为线性表的开头部分,对于我们后续学习数据结构中还是很重要的,需要我们把它学好,本篇文章也只是点了一下知识点并给出少许例子,更多的知识还需要我们自己去探索学习!

posted @ 2025-04-18 15:10  九思0404  阅读(46)  评论(0)    收藏  举报