数据结构_顺序表_顺序表的初始化、插入、删除、修改、查询打印(基于C语言实现)

版本:

2024年4月29日 V1.0 发布于博客园

/**
 * @file name : SequenceList.c
 * @brief     : 实现顺序表元素的增删查改
 * @author    : RISE_AND_GRIND@163.com
 * @date      : 2024/04/29
 * @version   : 1.0
 * @note      : 模块化实现
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

目录


顺序表公式

/**
 * 声明顺序表的结点
 *
 * 顺序表总结成公式
 *     struct xxx
 *     {
 *         //顺序表的首地址
 *         //顺序表的容量
 *         //顺序表中最后元素的下标
 *     };
 *   顺序表的基本操作:
 *     初始化单向循环链表 √
 *     插入数据 √
 *     删除数据 √
 *     修改数据 √
 *     查询打印数据√
 */

初始化顺序表

构建顺序表结点

// 顺序表中元素的数据类型, 用户可以工具需要进行修改
typedef int DataType_t;

// 构造记录顺序表SequenceList的各项参数的结构体
typedef struct SequenceList
{
    DataType_t *Addr;  // 记录顺序表的首地址
    unsigned int Size; // 记录顺序表的容量
    int Last;          // 顺序表中最后元素的下标 从0开始计算
} SeqList_t;

创建一个空顺序表

/**
 * @name      SeqList_Create
 * @brief     创建顺序表并对顺序表进行初始化
 * @param     Size 顺序表的大小
 * @return
 *      @retval    Manager 顺序表的管理结构体
 * @date      2024/04/29
 * @version   1.0
 * @note      Manager->Addr  --->  [Size*sizeof(DataType_t)]
 */
SeqList_t *SeqList_Create(unsigned int Size)
{
    // 使用calloc为顺序表的管理结构体申请一块堆内存
    SeqList_t *Manager = (SeqList_t *)calloc(1, sizeof(Manager));
    if (NULL == Manager)
    {
        perror("calloc memory for manager is failed");
        exit(-1); // 程序异常终止
    }

    // 利用calloc为所有元素申请堆内存
    Manager->Addr = (DataType_t *)calloc(Size, sizeof(DataType_t));
    if (NULL == Manager->Addr)
    {
        perror("calloc memory for element is failed");
        free(Manager); // 释放申请失败后的管理结构体
        exit(-1);      // 程序异常终止
    }

    // 对管理顺序表的结构体进行初始化(元素容量 + 最后元素的下标)
    Manager->Size = Size; // 对顺序表中的容量进行初始化
    Manager->Last = -1;   // 英语顺序表位空, 则最后元素下标初始值为-1
    return Manager;
}

顺序表判断

判断顺序表是否已满

/**
 * @name      SeqList_IsFull
 * @brief     判断顺序表是否已满
 * @param     Manager 顺序表的管理结构体
 * @return
 *      @retval    true 顺序表已满
 *      @retval    false 顺序表未满
 * @date      2024/04/29
 * @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      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_IsEmpty(SeqList_t *Manager)
{
    return (-1 == Manager->Last) ? true : false;
}

插入数据

头插

/**
 * @name      SeqList_HeadAdd
 * @brief     向顺序表的头部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_HeadAdd(SeqList_t *Manager, DataType_t Data)
{
    // 判断顺序表是否已满
    if (SeqList_IsFull(Manager))
    {
        printf("SequenceList is Full!\n");
        return false;
    }

    // 如果顺序表有空闲空间,则需要把顺序表所有元素向后移动1个单位
    for (int i = Manager->Last; i >= 0; i--)
    {
        Manager->Addr[i + 1] = Manager->Addr[i];
    }

    // 把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1
    Manager->Addr[0] = Data;
    Manager->Last++;

    return true;
}

尾插

/**
 * @name      SeqList_TailAdd
 * @brief     向顺序表的尾部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_TailAdd(SeqList_t *Manager, DataType_t Data)
{
    // 1.判断顺序表是否已满
    if (SeqList_IsFull(Manager))
    {
        printf("SequenceList is Full!\n");
        return false;
    }

    // 2.如果顺序表有空闲空间,则把新元素添加到顺序表尾部
    Manager->Addr[++Manager->Last] = Data;

    return true;
}

删除数据

指定元素删除

/**
 * @name      SeqList_Del
 * @brief     删除顺序表中的指定值的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Del(SeqList_t *Manager, DataType_t dest)
{
    int current = -1; // 记录要删除的元素下标

    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 查找目标值是否在顺序表中
    for (int i = 0; i < Manager->Last; ++i)
    {
        // 若在顺序表中找到目标值
        if (dest == Manager->Addr[i])
        {
            current = i; // 备份目标元素下标
            break;
        }
    }

    // 如果顺序表没有目标值的元素则直接终止函数
    if (-1 == current)
    {
        printf("destval [%d] is not found\n", dest);
        return false;
    }

    // 若找到目标元素, 直接将该元素的后继元素全部向前移动一个单元
    for (int i = current; i < Manager->Last; ++i)
    {
        Manager->Addr[i] = Manager->Addr[i + 1];
    }

    // 由于删除了一个元素, 应该让顺序表有效元素下标-1
    Manager->Last--;
    return true;
}

指定位置删除

/**
 * @name      SeqList_Remove
 * @brief     删除顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要删除的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Remove(SeqList_t *Manager, int index)
{
    // 判断顺序表的地址是否有效
    if (NULL == Manager->Addr)
    {
        perror("The address of the input SequenceList is invalid!");
        return false;
    }
    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 判断输入下标是否有效
    if (index < 0 || index >= Manager->Last)
    {
        printf("The position you entered is not valid. Please re-enter!\n");
        return false;
    }

    // 若输入的位置合法, 直接将该位置的后继元素全部向前移动一个单元
    for (int i = index - 1; i < Manager->Last; ++i) // 执行Last-index次
    {
        Manager->Addr[i] = Manager->Addr[i + 1];
    }

    // 由于删除了一个元素, 应该让顺序表有效元素下标-1
    Manager->Last--;
    return true;
}

修改数据

修改指定位置值

/**
 * @name      SeqList_Modify
 * @brief     修改顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要修改的元素下标
 * @param     dest 要修改的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Modify(SeqList_t *Manager, int index, DataType_t dest)
{
    // 判断顺序表的地址是否有效
    if (NULL == Manager->Addr)
    {
        perror("The address of the input SequenceList is invalid!");
        return false;
    }
    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 判断输入下标是否有效
    if (index < 0 || index >= Manager->Last)
    {
        printf("The position you entered is not valid. Please re-enter!\n");
        return false;
    }

    Manager->Addr[index - 1] = dest;

    return true;
}

查询打印数据

遍历打印

/**
 * @name      SeqList_Print
 * @brief     从头到尾遍历顺序表的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @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]); // 打印顺序表单元数据
    }
}

测试

/**
 * @file name : projecttesting.c
 * @brief     : 实现顺序表的相关功能测试
 * @author    : RISE_AND_GRIND@163.com
 * @date      : 2024/04/29
 * @version   : 1.0
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

#include "SequenceList.h"

int main(int argc, char const *argv[])
{
    // 创建顺序表, 空表
    SeqList_t *Manager = SeqList_Create(10);

    printf("*********************************SeqList_IsEmpty********************************\n");
    // 测试顺序表是否为空
    if (SeqList_IsEmpty(Manager) == true)
    {
        printf("SeqList is empty!\n");
    }

    // 头插法 向顺序表的头部加入元素
    printf("*********************************SeqList_HeadAdd********************************\n");
    SeqList_HeadAdd(Manager, 3);
    SeqList_HeadAdd(Manager, 2);
    SeqList_HeadAdd(Manager, 1);
    SeqList_Print(Manager);
    /*1 2 3*/

    // 尾插法 向链表中插入新结点
    printf("*********************************SeqList_TailAdd********************************\n");
    SeqList_TailAdd(Manager, 4);
    SeqList_TailAdd(Manager, 5);
    SeqList_TailAdd(Manager, 6);
    SeqList_TailAdd(Manager, 7);
    SeqList_TailAdd(Manager, 8);
    SeqList_Print(Manager);
    /*1 2 3 4 5 6 7 8*/

    // 删除顺序表中的指定值的元素
    printf("*********************************SeqList_Del********************************\n");
    SeqList_Del(Manager, 1);
    SeqList_Del(Manager, 3);
    SeqList_Del(Manager, 5);
    SeqList_Del(Manager, 7);
    SeqList_Print(Manager);
    /*2 4 6 8*/

    // 删除顺序表中的指定位置的元素
    printf("*********************************SeqList_Remove********************************\n");
    SeqList_Remove(Manager, 2);
    SeqList_Print(Manager);
    /*2 6 8*/

    // 修改顺序表中的指定位置的元素
    printf("*********************************SeqList_Modify********************************\n");
    SeqList_Modify(Manager, 1, 100);
    SeqList_Print(Manager);
    /*100 6 8*/

    // 等待用户响应
    printf("***Press any key to exit the test***\n");
    getchar();
    return 0;
}

测试结果:

*********************************SeqList_IsEmpty********************************
SeqList is empty!
*********************************SeqList_HeadAdd********************************
Element[0] = 1
Element[1] = 2
Element[2] = 3
*********************************SeqList_TailAdd********************************
Element[0] = 1
Element[1] = 2
Element[2] = 3
Element[3] = 4
Element[4] = 5
Element[5] = 6
Element[6] = 7
Element[7] = 8
*********************************SeqList_Del********************************
Element[0] = 2
Element[1] = 4
Element[2] = 6
Element[3] = 8
*********************************SeqList_Remove********************************
Element[0] = 2
Element[1] = 6
Element[2] = 8
*********************************SeqList_Modify********************************
Element[0] = 100
Element[1] = 6
Element[2] = 8
***Press any key to exit the test***

完整代码

SequenceList.h

#ifndef __SEQUENCELIST_H
#define __SEQUENCELIST_H
/**
 * @file name : SequenceList.c
 * @brief     : 实现顺序表元素的增删查改
 * @author    : RISE_AND_GRIND@163.com
 * @date      : 2024/04/29
 * @version   : 1.0
 * @note      : 模块化实现
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

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

/**
 * 声明顺序表的结点
 *
 * 顺序表总结成公式
 *     struct xxx
 *     {
 *         //顺序表的首地址
 *         //顺序表的容量
 *         //顺序表中最后元素的下标
 *     };
 *   双向循环链表的基本操作:
 *     初始化单向循环链表 √
 *     插入数据 √
 *     删除数据 √
 *     修改数据 √
 *     查询打印数据√
 */

// 顺序表中元素的数据类型, 用户可以工具需要进行修改
typedef int DataType_t;

// 构造记录顺序表SequenceList的各项参数的结构体
typedef struct SequenceList
{
    DataType_t *Addr;  // 记录顺序表的首地址
    unsigned int Size; // 记录顺序表的容量
    int Last;          // 顺序表中最后元素的下标 从0开始计算
} SeqList_t;

/**
 * @name      SeqList_Create
 * @brief     创建顺序表并对顺序表进行初始化
 * @param     Size 顺序表的大小
 * @return
 *      @retval    Manager 顺序表的管理结构体
 * @date      2024/04/29
 * @version   1.0
 * @note      Manager->Addr  --->  [Size*sizeof(DataType_t)]
 */
SeqList_t *SeqList_Create(unsigned int Size);

/**
 * @name      SeqList_IsFull
 * @brief     判断顺序表是否已满
 * @param     Manager 顺序表的管理结构体
 * @return
 *      @retval    true 顺序表已满
 *      @retval    false 顺序表未满
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_IsFull(SeqList_t *Manager);

/**
 * @name      SeqList_IsEmpty
 * @brief     判断顺序表是否为空
 * @param     Manager 顺序表的管理结构体
 * @return
 *      @retval    true 顺序表为空
 *      @retval    false 顺序表非空
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_IsEmpty(SeqList_t *Manager);

/**
 * @name      SeqList_TailAdd
 * @brief     向顺序表的尾部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_TailAdd(SeqList_t *Manager, DataType_t Data);

/**
 * @name      SeqList_HeadAdd
 * @brief     向顺序表的头部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_HeadAdd(SeqList_t *Manager, DataType_t Data);

/**
 * @name      SeqList_Del
 * @brief     删除顺序表中的指定值的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Del(SeqList_t *Manager, DataType_t dest);

/**
 * @name      SeqList_Remove
 * @brief     删除顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要删除的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Remove(SeqList_t *Manager, int index);

/**
 * @name      SeqList_Modify
 * @brief     修改顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要修改的元素下标
 * @param     dest 要修改的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Modify(SeqList_t *Manager, int index, DataType_t dest);

/**
 * @name      SeqList_Print
 * @brief     从头到尾遍历顺序表的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
void SeqList_Print(SeqList_t *Manager);
#endif

SequenceList.c

/**
 * @file name : SequenceList.c
 * @brief     : 实现顺序表元素的增删查改
 * @author    : RISE_AND_GRIND@163.com
 * @date      : 2024/04/29
 * @version   : 1.0
 * @note      : 模块化实现
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */
#include "SequenceList.h"

/**
 * @name      SeqList_Create
 * @brief     创建顺序表并对顺序表进行初始化
 * @param     Size 顺序表的大小
 * @return
 *      @retval    Manager 顺序表的管理结构体
 * @date      2024/04/29
 * @version   1.0
 * @note      Manager->Addr  --->  [Size*sizeof(DataType_t)]
 */
SeqList_t *SeqList_Create(unsigned int Size)
{
    // 使用calloc为顺序表的管理结构体申请一块堆内存
    SeqList_t *Manager = (SeqList_t *)calloc(1, sizeof(Manager));
    if (NULL == Manager)
    {
        perror("calloc memory for manager is failed");
        exit(-1); // 程序异常终止
    }

    // 利用calloc为所有元素申请堆内存
    Manager->Addr = (DataType_t *)calloc(Size, sizeof(DataType_t));
    if (NULL == Manager->Addr)
    {
        perror("calloc memory for element is failed");
        free(Manager); // 释放申请失败后的管理结构体
        exit(-1);      // 程序异常终止
    }

    // 对管理顺序表的结构体进行初始化(元素容量 + 最后元素的下标)
    Manager->Size = Size; // 对顺序表中的容量进行初始化
    Manager->Last = -1;   // 英语顺序表位空, 则最后元素下标初始值为-1
    return Manager;
}

/**
 * @name      SeqList_IsFull
 * @brief     判断顺序表是否已满
 * @param     Manager 顺序表的管理结构体
 * @return
 *      @retval    true 顺序表已满
 *      @retval    false 顺序表未满
 * @date      2024/04/29
 * @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      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_IsEmpty(SeqList_t *Manager)
{
    return (-1 == Manager->Last) ? true : false;
}

/**
 * @name      SeqList_TailAdd
 * @brief     向顺序表的尾部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_TailAdd(SeqList_t *Manager, DataType_t Data)
{
    // 1.判断顺序表是否已满
    if (SeqList_IsFull(Manager))
    {
        printf("SequenceList is Full!\n");
        return false;
    }

    // 2.如果顺序表有空闲空间,则把新元素添加到顺序表尾部
    Manager->Addr[++Manager->Last] = Data;

    return true;
}

/**
 * @name      SeqList_HeadAdd
 * @brief     向顺序表的头部加入元素
 * @param     Manager 顺序表的管理结构体
 * @param     Data 要加入的元素
 * @return
 *      @retval    true 插入成功
 *      @retval    false 插入失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_HeadAdd(SeqList_t *Manager, DataType_t Data)
{
    // 判断顺序表是否已满
    if (SeqList_IsFull(Manager))
    {
        printf("SequenceList is Full!\n");
        return false;
    }

    // 如果顺序表有空闲空间,则需要把顺序表所有元素向后移动1个单位
    for (int i = Manager->Last; i >= 0; i--)
    {
        Manager->Addr[i + 1] = Manager->Addr[i];
    }

    // 把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1
    Manager->Addr[0] = Data;
    Manager->Last++;

    return true;
}

/**
 * @name      SeqList_Del
 * @brief     删除顺序表中的指定值的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Del(SeqList_t *Manager, DataType_t dest)
{
    int current = -1; // 记录要删除的元素下标

    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 查找目标值是否在顺序表中
    for (int i = 0; i < Manager->Last; ++i)
    {
        // 若在顺序表中找到目标值
        if (dest == Manager->Addr[i])
        {
            current = i; // 备份目标元素下标
            break;
        }
    }

    // 如果顺序表没有目标值的元素则直接终止函数
    if (-1 == current)
    {
        printf("destval [%d] is not found\n", dest);
        return false;
    }

    // 若找到目标元素, 直接将该元素的后继元素全部向前移动一个单元
    for (int i = current; i < Manager->Last; ++i)
    {
        Manager->Addr[i] = Manager->Addr[i + 1];
    }

    // 由于删除了一个元素, 应该让顺序表有效元素下标-1
    Manager->Last--;
    return true;
}

/**
 * @name      SeqList_Remove
 * @brief     删除顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要删除的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Remove(SeqList_t *Manager, int index)
{
    // 判断顺序表的地址是否有效
    if (NULL == Manager->Addr)
    {
        perror("The address of the input SequenceList is invalid!");
        return false;
    }
    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 判断输入下标是否有效
    if (index < 0 || index >= Manager->Last)
    {
        printf("The position you entered is not valid. Please re-enter!\n");
        return false;
    }

    // 若输入的位置合法, 直接将该位置的后继元素全部向前移动一个单元
    for (int i = index - 1; i < Manager->Last; ++i) // 执行Last-index次
    {
        Manager->Addr[i] = Manager->Addr[i + 1];
    }

    // 由于删除了一个元素, 应该让顺序表有效元素下标-1
    Manager->Last--;
    return true;
}

/**
 * @name      SeqList_Modify
 * @brief     修改顺序表中的指定位置的元素
 * @param     Manager 顺序表的管理结构体
 * @param     index 要修改的元素下标
 * @param     dest 要修改的元素下标
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @version   1.0
 * @note
 */
bool SeqList_Modify(SeqList_t *Manager, int index, DataType_t dest)
{
    // 判断顺序表的地址是否有效
    if (NULL == Manager->Addr)
    {
        perror("The address of the input SequenceList is invalid!");
        return false;
    }
    // 判断顺序表是否为空
    if (SeqList_IsEmpty(Manager))
    {
        printf("SequenceList is Empty! \n");
        return false;
    }

    // 判断输入下标是否有效
    if (index < 0 || index >= Manager->Last)
    {
        printf("The position you entered is not valid. Please re-enter!\n");
        return false;
    }

    Manager->Addr[index - 1] = dest;

    return true;
}

/**
 * @name      SeqList_Print
 * @brief     从头到尾遍历顺序表的元素
 * @param     Manager 顺序表的管理结构体
 * @param     dest 要删除的元素
 * @return
 *      @retval    true 删除成功
 *      @retval    false 删除失败
 * @date      2024/04/29
 * @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]); // 打印顺序表单元数据
    }
}

projecttesting.c

/**
 * @file name : projecttesting.c
 * @brief     : 实现顺序表的相关功能测试
 * @author    : RISE_AND_GRIND@163.com
 * @date      : 2024/04/29
 * @version   : 1.0
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

#include "SequenceList.h"

int main(int argc, char const *argv[])
{
    // 创建顺序表, 空表
    SeqList_t *Manager = SeqList_Create(10);

    printf("*********************************SeqList_IsEmpty********************************\n");
    // 测试顺序表是否为空
    if (SeqList_IsEmpty(Manager) == true)
    {
        printf("SeqList is empty!\n");
    }

    // 头插法 向顺序表的头部加入元素
    printf("*********************************SeqList_HeadAdd********************************\n");
    SeqList_HeadAdd(Manager, 3);
    SeqList_HeadAdd(Manager, 2);
    SeqList_HeadAdd(Manager, 1);
    SeqList_Print(Manager);
    /*1 2 3*/

    // 尾插法 向链表中插入新结点
    printf("*********************************SeqList_TailAdd********************************\n");
    SeqList_TailAdd(Manager, 4);
    SeqList_TailAdd(Manager, 5);
    SeqList_TailAdd(Manager, 6);
    SeqList_TailAdd(Manager, 7);
    SeqList_TailAdd(Manager, 8);
    SeqList_Print(Manager);
    /*1 2 3 4 5 6 7 8*/

    // 删除顺序表中的指定值的元素
    printf("*********************************SeqList_Del********************************\n");
    SeqList_Del(Manager, 1);
    SeqList_Del(Manager, 3);
    SeqList_Del(Manager, 5);
    SeqList_Del(Manager, 7);
    SeqList_Print(Manager);
    /*2 4 6 8*/

    // 删除顺序表中的指定位置的元素
    printf("*********************************SeqList_Remove********************************\n");
    SeqList_Remove(Manager, 2);
    SeqList_Print(Manager);
    /*2 6 8*/

    // 修改顺序表中的指定位置的元素
    printf("*********************************SeqList_Modify********************************\n");
    SeqList_Modify(Manager, 1, 100);
    SeqList_Print(Manager);
    /*100 6 8*/

    // 等待用户响应
    printf("***Press any key to exit the test***\n");
    getchar();
    return 0;
}
posted @ 2024-04-30 01:07  舟清颺  阅读(15)  评论(0编辑  收藏  举报