資料結構_順序表_順序表的初始化、插入、刪除、修改、查詢列印(基於C語言實現)

舟清颺發表於2024-04-30

版本:

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
 */

目錄

目錄
  • 目錄
  • 順序表公式
  • 初始化順序表
    • 構建順序表結點
    • 建立一個空順序表
  • 順序表判斷
    • 判斷順序表是否已滿
    • 判斷順序表是否為空
  • 插入資料
    • 頭插
    • 尾插
  • 刪除資料
    • 指定元素刪除
    • 指定位置刪除
  • 修改資料
    • 修改指定位置值
  • 查詢列印資料
    • 遍歷列印
  • 測試
    • 測試結果:
  • 完整程式碼
    • SequenceList.h
    • SequenceList.c
    • projecttesting.c


順序表公式

/**
 * 宣告順序表的結點
 *
 * 順序表總結成公式
 *     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;
}

相關文章