国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打印(基于C語(yǔ)言實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

版本:

2024年4月25日 V1.0 發(fā)布于博客園

/**
 * @file name : CircularLinkedList.c
 * @brief     : 實(shí)現(xiàn)單向循環(huán)鏈表的相關(guān)功能
 * @author    :RISE_AND_GRIND@163.com
 * @date      :2024/04/25
 * @version   :1.1
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

目錄

目錄
  • 目錄
  • 單向循環(huán)鏈表公式
  • 初始化單向循環(huán)鏈表
    • 構(gòu)建單向循環(huán)鏈表結(jié)點(diǎn)
    • 創(chuàng)建一個(gè)空鏈表(僅頭結(jié)點(diǎn))
    • 創(chuàng)建一個(gè)新結(jié)點(diǎn)
  • 插入數(shù)據(jù)
    • 頭插
    • 中插
    • 尾插
  • 刪除數(shù)據(jù)
    • 頭刪
    • 中刪
    • 尾刪
  • 查詢打印數(shù)據(jù)
    • 遍歷打印
  • 測(cè)試
    • 測(cè)試結(jié)果:
  • 完整代碼
    • CircularLinkedList.h
    • CircularLinkedList.c
    • projecttesting.c

單向循環(huán)鏈表公式

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

/**
 * 聲明單循環(huán)鏈表的結(jié)點(diǎn)
 *
 * 單向循環(huán)鏈表總結(jié)成公式
 *     struct xxx
 *     {
 *         //數(shù)據(jù)域(需要存放什么類型的數(shù)據(jù),你就定義對(duì)應(yīng)的變量即可)
 *         //指針域(直接后繼的指針域)
 *     };
 *   單向循環(huán)鏈表的基本操作:
 *     初始化單向循環(huán)鏈表 √
 *     插入數(shù)據(jù) √
 *     刪除數(shù)據(jù) √
 *     修改數(shù)據(jù)
 *     查詢打印數(shù)據(jù)√
 */

初始化單向循環(huán)鏈表

構(gòu)建單向循環(huán)鏈表結(jié)點(diǎn)

CircLList_t[ data |*next ]

// 指的是單向循環(huán)鏈表中的結(jié)點(diǎn)有效數(shù)據(jù)類型,用戶可以根據(jù)需要進(jìn)行修改
typedef int DataType_t;

// 構(gòu)造單向循環(huán)鏈表的結(jié)點(diǎn),鏈表中所有結(jié)點(diǎn)的數(shù)據(jù)類型應(yīng)該是相同的
typedef struct CircularLinkedList
{
    DataType_t data;                 // 結(jié)點(diǎn)的數(shù)據(jù)域
    struct CircularLinkedList *next; // 直接后繼的指針域
} CircLList_t;

創(chuàng)建一個(gè)空鏈表(僅頭結(jié)點(diǎn))

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_Create
 * @brief     創(chuàng)建一個(gè)空單向循環(huán)鏈表,僅含頭結(jié)點(diǎn),并對(duì)鏈表進(jìn)行初始化
 * @param
 * @return
 *      @retval    Head 頭結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_Create(void)
{
    // 1.創(chuàng)建一個(gè)頭結(jié)點(diǎn)并對(duì)頭結(jié)點(diǎn)申請(qǐng)內(nèi)存
    CircLList_t *Head = (CircLList_t *)calloc(1, sizeof(CircLList_t));
    if (NULL == Head)
    {
        perror("Calloc memory for Head is Failed");
        exit(-1);
    }

    // 2.對(duì)頭結(jié)點(diǎn)進(jìn)行初始化,頭結(jié)點(diǎn)是不存儲(chǔ)數(shù)據(jù)域,指針域指向自己, 體現(xiàn)循環(huán)的思想 [date|*next]
    Head->next = Head;

    // 3.把頭結(jié)點(diǎn)的地址返回即可   Head-->[date|*next]
    return Head;
}

創(chuàng)建一個(gè)新結(jié)點(diǎn)

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打印(基于C語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_NewNode
 * @brief     創(chuàng)建一個(gè)新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化(數(shù)據(jù)域 + 指針域)
 * @param     data 要?jiǎng)?chuàng)建結(jié)點(diǎn)的元素
 * @return    程序執(zhí)行成功與否
 *      @retval    NULL 申請(qǐng)堆內(nèi)存失敗
 *      @retval    New  新結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_NewNode(DataType_t data)
{
    // 1.創(chuàng)建一個(gè)新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)申請(qǐng)內(nèi)存
    CircLList_t *New = (CircLList_t *)calloc(1, sizeof(CircLList_t));
    if (NULL == New)
    {
        perror("Calloc memory for NewNode is Failed");
        return NULL;
    }

    // 2.對(duì)新結(jié)點(diǎn)的數(shù)據(jù)域和指針域進(jìn)行初始化
    New->data = data;
    New->next = NULL;

    return New;
}

插入數(shù)據(jù)

頭插

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打印(基于C語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_HeadInsert
 * @brief     在單向循環(huán)鏈表的頭結(jié)點(diǎn)后插入
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadInsert(CircLList_t *Head, DataType_t data)
{
    // 備份頭指針, 創(chuàng)建操作指針
    CircLList_t *Current = Head;

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則直接插入到頭結(jié)點(diǎn)之后, 新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán), 僅有一個(gè)首結(jié)點(diǎn)的單循環(huán)鏈表
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向首結(jié)點(diǎn)
    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Current = Current->next;         // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    } // Current到達(dá)未尾結(jié)點(diǎn)
    Current->next = New;    // 尾結(jié)點(diǎn)指針域指向新的首結(jié)點(diǎn)
    New->next = Head->next; // 新結(jié)點(diǎn)鏈接舊首結(jié)點(diǎn)
    Head->next = New;       // 頭結(jié)點(diǎn)的next指針域指向新結(jié)點(diǎn)的地址

    return true;
}

中插

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打印(基于C語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_DestInsert
 * @brief     單向循環(huán)鏈表中的指定元素后面插入新結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要查找的結(jié)點(diǎn)
 * @param     data 要插入的數(shù)據(jù)
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestInsert(CircLList_t *Head, DataType_t dest, DataType_t data)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán), 單有效結(jié)點(diǎn)
        return true;
    }

    // 3.若單向循環(huán)鏈表非空,需要讓尾結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)指向首結(jié)點(diǎn)
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn), 不再繼續(xù)查找. 目標(biāo)結(jié)點(diǎn)非首結(jié)點(diǎn), 繼續(xù)向下查找
    while (Current->data != dest)
    {
        Current = Current->next;                                      // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if ((Current->next == Head->next) && (Current->data != dest)) // 達(dá)到末尾 且 末尾不是目標(biāo)
        {
            printf("The target doesn't exist! \n");
            return false;
        }
    } // 找到目標(biāo)結(jié)點(diǎn), Current此時(shí)指向目標(biāo)
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn)
    if (Current == Head->next)
    {
        New->next = Current->next; // 新結(jié)點(diǎn)鏈接目標(biāo)結(jié)點(diǎn)直接后繼
        Current->next = New;
    }
    else if (Current->next == Head->next) // 目標(biāo)結(jié)點(diǎn)是尾結(jié)點(diǎn)
    {
        New->next = Head->next; // 作為新尾結(jié)點(diǎn)
        Current->next = New;
    }
    else // 目標(biāo)結(jié)點(diǎn)是中間結(jié)點(diǎn)
    {
        New->next = Current->next; // 新結(jié)點(diǎn)鏈接目標(biāo)結(jié)點(diǎn)直接后繼
        Current->next = New;       // 目標(biāo)結(jié)點(diǎn)的直接后繼更新為新結(jié)點(diǎn)
    }
    return true;
}

尾插

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

/**
 * @name      CircLList_TailInsert
 * @brief     將新元素插入到尾結(jié)點(diǎn)后面
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_TailInsert(CircLList_t *Head, DataType_t data)
{
    CircLList_t *Phead = Head; // 備份頭結(jié)點(diǎn)地址,防止頭結(jié)點(diǎn)丟失

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán)
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)指向首結(jié)點(diǎn)
    while (Phead->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Phead = Phead->next;           // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Phead->next == Head->next) // 當(dāng)?shù)竭_(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    }
    Phead->next = New;      // 尾結(jié)點(diǎn)指針域 鏈接 新結(jié)點(diǎn)
    New->next = Head->next; // 新結(jié)點(diǎn)指針域 指向 首結(jié)點(diǎn)

    return true;
}

刪除數(shù)據(jù)

頭刪

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_HeadDel
 * @brief     刪除頭結(jié)點(diǎn)后面的一個(gè)結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗
 *      @retval    true  刪除成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadDel(CircLList_t *Head)
{
    // 1.創(chuàng)建操作指針
    // 備份頭結(jié)點(diǎn)地址,防止頭結(jié)點(diǎn)丟失
    CircLList_t *Phead = Head;
    // 備份首結(jié)點(diǎn), 用于操作
    CircLList_t *Temp = Head->next;

    // 2.判斷單向循環(huán)鏈表是否為空鏈表,如果為空, 則退出
    if (Head == Head->next)
    {
        printf("CircLList is Empty! \n");
        return false;
    }

    // 3.判斷鏈表中是否只有首結(jié)點(diǎn)

    if (Head->next == Head->next->next)
    {
        Temp->next = NULL; // 首結(jié)點(diǎn)的指針域指向NULL, 且防止野指針和內(nèi)存泄漏
        Head->next = Head; // 頭結(jié)點(diǎn)next指針指向頭結(jié)點(diǎn), 體現(xiàn)"循環(huán)"
        free(Temp);        // 釋放結(jié)點(diǎn)內(nèi)存, 防止內(nèi)存泄漏
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向新的首結(jié)點(diǎn)(原首結(jié)點(diǎn)的直接后繼)
    while (Phead->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Phead = Phead->next;           // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Phead->next == Head->next) // 當(dāng)?shù)竭_(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    }

    Phead->next = Head->next->next; // 讓尾結(jié)點(diǎn)的next指針指向新的首結(jié)點(diǎn)(原首結(jié)點(diǎn)的直接后繼)
    Head->next = Phead->next;       // 頭結(jié)點(diǎn)的指針域 修改鏈接為 新的首結(jié)點(diǎn)
    Temp->next = NULL;              // 讓舊的首結(jié)點(diǎn)的指針域指向NULL, 從鏈表中斷開, 且防止野指針和內(nèi)存泄漏
    free(Temp);                     // 釋放舊首結(jié)點(diǎn)的內(nèi)存, 防止內(nèi)存泄漏
    return true;
}

中刪

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))

/**
 * @name       CircLList_DestDel
 * @brief     中刪, 刪除某個(gè)元素結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要?jiǎng)h除的目標(biāo)元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 未找到目標(biāo)元素結(jié)點(diǎn)
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestDel(CircLList_t *Head, DataType_t dest)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)
    CircLList_t *Prev = Head;          // 操作指針 存放當(dāng)前操作指針的前一個(gè)結(jié)點(diǎn)地址

    // 1.判斷單向循環(huán)鏈表是否為空,如果為空,則報(bào)錯(cuò)
    if (Head == Head->next)
    {
        printf("Error,  CircularLinkList is empty! \n");
        return false;
    }

    // 2.若單向循環(huán)鏈表非空
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn), 不再繼續(xù)查找. 目標(biāo)結(jié)點(diǎn)非首結(jié)點(diǎn), 繼續(xù)向下查找
    while (Current->data != dest)
    {
        Prev = Current;                                               // 備份Current的前一個(gè)位置
        Current = Current->next;                                      // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if ((Current->next == Head->next) && (Current->data != dest)) // 達(dá)到末尾 且 末尾不是目標(biāo)
        {
            printf("The target doesn't exist! \n");
            return false;
        }
    } // 找到目標(biāo)結(jié)點(diǎn), Current此時(shí)指向目標(biāo)  Prev為Current 的前一個(gè)位置
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn)
    if (Current == Head->next)
    {
        // 若鏈表只有首結(jié)點(diǎn)
        if (Current->next == Head->next)
        {
            Head->next = Head; // 空鏈表狀態(tài)
            Current->next = NULL;
            free(Current); // 防止內(nèi)存泄漏
            return true;
        }
        while (Prev->next) // 不斷向下檢查結(jié)點(diǎn)指針域
        {
            Prev = Prev->next;            // 進(jìn)入下一個(gè)結(jié)點(diǎn)
            if (Prev->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
            {
                break;
            }
        } // Prev到達(dá)未尾結(jié)點(diǎn)
        Prev->next = Current->next; // 更新尾結(jié)點(diǎn)指針域?yàn)樾率捉Y(jié)點(diǎn)地址
        Head->next = Current->next; // 更新首結(jié)點(diǎn)鏈接新首結(jié)點(diǎn)
    }
    else if (Current->next == Head->next) // 目標(biāo)結(jié)點(diǎn)是尾結(jié)點(diǎn)
    {
        Prev->next = Head->next; // 新尾結(jié)點(diǎn)鏈接首結(jié)點(diǎn), 行成循環(huán)
    }
    else // 目標(biāo)結(jié)點(diǎn)是中間結(jié)點(diǎn)
    {
        Prev->next = Current->next;
    }
    Current->next = NULL;
    free(Current); // 防止內(nèi)存泄漏
    return true;
}

尾刪

數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))文章來源地址http://www.zghlxwxcb.cn/news/detail-858002.html

/**
 * @name      CircLList_TailDel
 * @brief     刪除尾結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 鏈表為空
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.0
 * @note
 */
bool CircLList_TailDel(CircLList_t *Head)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)
    CircLList_t *Prev = Head;          // 操作指針 存放當(dāng)前操作指針的前一個(gè)結(jié)點(diǎn)地址

    // 1.判斷單向循環(huán)鏈表是否為空,如果為空,則報(bào)錯(cuò)
    if (Head == Head->next)
    {
        printf("Error,  CircularLinkList is empty! \n");
        return false;
    }

    // 2.若單向循環(huán)鏈表非空
    // 若鏈表只有首結(jié)點(diǎn)
    if (Current->next == Head->next)
    {
        Head->next = Head; // 空鏈表狀態(tài)
        Current->next = NULL;
        free(Current); // 防止內(nèi)存泄漏
        return true;
    }
    // 若還有別的結(jié)點(diǎn)
    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Prev = Current;
        Current = Current->next;         // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    } // Current到達(dá)未尾結(jié)點(diǎn) Prev為Current 的前一個(gè)位置
    Prev->next = Head->next; // 新尾結(jié)點(diǎn)鏈接首結(jié)點(diǎn), 行成循環(huán)
    Current->next = NULL;
    free(Current); // 防止內(nèi)存泄漏
    return true;
}

查詢打印數(shù)據(jù)

遍歷打印

/**
 * @name      CircLList_Print
 * @brief     從頭到尾遍歷鏈表
 * @param     Head 頭指針
 * @return    無
 * @date      2024/04/23
 * @version   1.0
 * @note
 */
void CircLList_Print(CircLList_t *Head)
{
    // 判斷是否為空鏈表
    if (Head->next == Head)
    {
        printf("The list is empty.\n");
        return;
    }

    CircLList_t *Current = Head->next; // 指向首結(jié)點(diǎn)

    printf("Circular Linked List: ");

    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        printf(" -> %d", Current->data); // 打印結(jié)點(diǎn)數(shù)據(jù)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
        Current = Current->next; // 進(jìn)入下一個(gè)結(jié)點(diǎn)
    }
    printf("\n"); // 刷新行緩沖, 輸出緩沖區(qū)
}

測(cè)試

#include "CircularLinkedList.h"

int main(int argc, char const *argv[])
{
    // 創(chuàng)建單向循環(huán)鏈表, 空鏈表
    CircLList_t *Manager = CircLList_Create();

    // 頭插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_HeadInsert********************************\n");
    CircLList_HeadInsert(Manager, 7);
    CircLList_HeadInsert(Manager, 4);
    CircLList_HeadInsert(Manager, 1);
    CircLList_HeadInsert(Manager, 8);
    CircLList_HeadInsert(Manager, 5);
    CircLList_HeadInsert(Manager, 2);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 5 -> 8 -> 1 -> 4 -> 7*/

    // 中插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_DestInsert********************************\n");
    CircLList_DestInsert(Manager, 7, 9);
    CircLList_DestInsert(Manager, 4, 6);
    CircLList_DestInsert(Manager, 2, 3);
    CircLList_DestInsert(Manager, 5, 10);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9*/

    // 尾插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_TailInsert********************************\n");
    CircLList_TailInsert(Manager, 13);
    CircLList_TailInsert(Manager, 12);
    CircLList_TailInsert(Manager, 11);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11*/

    // 頭刪法 刪除首結(jié)點(diǎn)
    printf("*********************************CircLList_HeadDel********************************\n");
    CircLList_HeadDel(Manager);
    CircLList_HeadDel(Manager);
    CircLList_HeadDel(Manager);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11*/

    // 中刪法 刪除指定結(jié)點(diǎn)
    printf("*********************************CircLList_DestDel********************************\n");
    CircLList_DestDel(Manager, 10);
    CircLList_DestDel(Manager, 1);
    CircLList_DestDel(Manager, 6);
    CircLList_DestDel(Manager, 11);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 8 -> 4 -> 7 -> 9 -> 13 -> 12*/

    // 尾刪法 刪除尾結(jié)點(diǎn)
    printf("*********************************CircLList_HeadDel********************************\n");
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 8 -> 4*/
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    /*Error,  CircularLinkList is empty! */
    CircLList_HeadInsert(Manager, 66);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 66*/
    // 等待用戶響應(yīng)
    printf("***Press any key to exit the test***\n");
    getchar();
    return 0;
}

測(cè)試結(jié)果:

*********************************CircLList_HeadInsert********************************
Circular Linked List:  -> 2 -> 5 -> 8 -> 1 -> 4 -> 7
*********************************CircLList_DestInsert********************************
Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9
*********************************CircLList_TailInsert********************************
Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11
*********************************CircLList_HeadDel********************************
Circular Linked List:  -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11
*********************************CircLList_DestDel********************************
Circular Linked List:  -> 8 -> 4 -> 7 -> 9 -> 13 -> 12
*********************************CircLList_HeadDel********************************
Circular Linked List:  -> 8 -> 4
Error,  CircularLinkList is empty! 
Circular Linked List:  -> 66
***Press any key to exit the test***

完整代碼

CircularLinkedList.h

#ifndef __CIRCULARLINKEDLIST_H // ifndef是(如果 沒有 定義 那么) (__該頭文件的名稱)
#define __CIRCULARLINKEDLIST_H // #define是 進(jìn)行定義
/**
 * @file name : CircularLinkedList.c
 * @brief     : 實(shí)現(xiàn)單向循環(huán)鏈表的相關(guān)功能
 * @author    :RISE_AND_GRIND@163.com
 * @date      :2024/04/25
 * @version   :1.1
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

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

/**
 * 聲明單循環(huán)鏈表的結(jié)點(diǎn)
 *
 * 單向循環(huán)鏈表總結(jié)成公式
 *     struct xxx
 *     {
 *         //數(shù)據(jù)域(需要存放什么類型的數(shù)據(jù),你就定義對(duì)應(yīng)的變量即可)
 *         //指針域(直接后繼的指針域)
 *     };
 *   單向循環(huán)鏈表的基本操作:
 *     初始化單向循環(huán)鏈表 √
 *     插入數(shù)據(jù) √
 *     刪除數(shù)據(jù) √
 *     修改數(shù)據(jù)
 *     查詢打印數(shù)據(jù)√
 */

// 指的是單向循環(huán)鏈表中的結(jié)點(diǎn)有效數(shù)據(jù)類型,用戶可以根據(jù)需要進(jìn)行修改
typedef int DataType_t;

// 構(gòu)造單向循環(huán)鏈表的結(jié)點(diǎn),鏈表中所有結(jié)點(diǎn)的數(shù)據(jù)類型應(yīng)該是相同的
typedef struct CircularLinkedList
{
    DataType_t data;                 // 結(jié)點(diǎn)的數(shù)據(jù)域
    struct CircularLinkedList *next; // 直接后繼的指針域
} CircLList_t;

/**
 * @name       CircLList_Create
 * @brief     創(chuàng)建一個(gè)空單向循環(huán)鏈表,僅含頭結(jié)點(diǎn),并對(duì)鏈表進(jìn)行初始化
 * @param
 * @return
 *      @retval    Head 頭結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_Create(void);

/**
 * @name       CircLList_NewNode
 * @brief     創(chuàng)建一個(gè)新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化(數(shù)據(jù)域 + 指針域)
 * @param     data 要?jiǎng)?chuàng)建結(jié)點(diǎn)的元素
 * @return    程序執(zhí)行成功與否
 *      @retval    NULL 申請(qǐng)堆內(nèi)存失敗
 *      @retval    New  新結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_NewNode(DataType_t data);

/**
 * @name       CircLList_HeadInsert
 * @brief     在單向循環(huán)鏈表的頭結(jié)點(diǎn)后插入
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadInsert(CircLList_t *Head, DataType_t data);

/**
 * @name       CircLList_DestInsert
 * @brief     單向循環(huán)中的指定元素后面插入新結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要查找的結(jié)點(diǎn)
 * @param     data 要插入的數(shù)據(jù)
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestInsert(CircLList_t *Head, DataType_t dest, DataType_t data);

/**
 * @name      CircLList_TailInsert
 * @brief     將新元素插入到尾結(jié)點(diǎn)后面
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_TailInsert(CircLList_t *Head, DataType_t data);

/**
 * @name       CircLList_HeadDel
 * @brief     刪除頭結(jié)點(diǎn)后面的一個(gè)結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗
 *      @retval    true  刪除成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadDel(CircLList_t *Head);

/**
 * @name       CircLList_DestDel
 * @brief     中刪, 刪除某個(gè)元素結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要?jiǎng)h除的目標(biāo)元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 未找到目標(biāo)元素結(jié)點(diǎn)
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestDel(CircLList_t *Head, DataType_t dest);

/**
 * @name      CircLList_TailDel
 * @brief     刪除尾結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 鏈表為空
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.0
 * @note
 */
bool CircLList_TailDel(CircLList_t *Head);
/**
 * @name      CircLList_Print
 * @brief     從頭到尾遍歷鏈表
 * @param     Head 頭指針
 * @return    無
 * @date      2024/04/23
 * @version   1.0
 * @note
 */
void CircLList_Print(CircLList_t *Head);
#endif
// 結(jié)束定義

CircularLinkedList.c

/**
 * @file name : CircularLinkedList.c
 * @brief     : 實(shí)現(xiàn)單向循環(huán)鏈表的相關(guān)功能
 * @author    :RISE_AND_GRIND@163.com
 * @date      :2024/04/25
 * @version   :1.1
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */
#include "CircularLinkedList.h"

/**
 * @name       CircLList_Create
 * @brief     創(chuàng)建一個(gè)空單向循環(huán)鏈表,僅含頭結(jié)點(diǎn),并對(duì)鏈表進(jìn)行初始化
 * @param
 * @return
 *      @retval    Head 頭結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_Create(void)
{
    // 1.創(chuàng)建一個(gè)頭結(jié)點(diǎn)并對(duì)頭結(jié)點(diǎn)申請(qǐng)內(nèi)存
    CircLList_t *Head = (CircLList_t *)calloc(1, sizeof(CircLList_t));
    if (NULL == Head)
    {
        perror("Calloc memory for Head is Failed");
        exit(-1);
    }

    // 2.對(duì)頭結(jié)點(diǎn)進(jìn)行初始化,頭結(jié)點(diǎn)是不存儲(chǔ)數(shù)據(jù)域,指針域指向自己, 體現(xiàn)循環(huán)的思想 [date|*next]
    Head->next = Head;

    // 3.把頭結(jié)點(diǎn)的地址返回即可   Head-->[date|*next]
    return Head;
}

/**
 * @name       CircLList_NewNode
 * @brief     創(chuàng)建一個(gè)新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化(數(shù)據(jù)域 + 指針域)
 * @param     data 要?jiǎng)?chuàng)建結(jié)點(diǎn)的元素
 * @return    程序執(zhí)行成功與否
 *      @retval    NULL 申請(qǐng)堆內(nèi)存失敗
 *      @retval    New  新結(jié)點(diǎn)地址
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
CircLList_t *CircLList_NewNode(DataType_t data)
{
    // 1.創(chuàng)建一個(gè)新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)申請(qǐng)內(nèi)存
    CircLList_t *New = (CircLList_t *)calloc(1, sizeof(CircLList_t));
    if (NULL == New)
    {
        perror("Calloc memory for NewNode is Failed");
        return NULL;
    }

    // 2.對(duì)新結(jié)點(diǎn)的數(shù)據(jù)域和指針域進(jìn)行初始化
    New->data = data;
    New->next = NULL;

    return New;
}

/**
 * @name       CircLList_HeadInsert
 * @brief     在單向循環(huán)鏈表的頭結(jié)點(diǎn)后插入
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadInsert(CircLList_t *Head, DataType_t data)
{
    // 備份頭指針, 創(chuàng)建操作指針
    CircLList_t *Current = Head;

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則直接插入到頭結(jié)點(diǎn)之后, 新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán), 僅有一個(gè)首結(jié)點(diǎn)的單循環(huán)鏈表
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向首結(jié)點(diǎn)
    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Current = Current->next;         // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    } // Current到達(dá)未尾結(jié)點(diǎn)
    Current->next = New;    // 尾結(jié)點(diǎn)指針域指向新的首結(jié)點(diǎn)
    New->next = Head->next; // 新結(jié)點(diǎn)鏈接舊首結(jié)點(diǎn)
    Head->next = New;       // 頭結(jié)點(diǎn)的next指針域指向新結(jié)點(diǎn)的地址

    return true;
}

/**
 * @name       CircLList_DestInsert
 * @brief     單向循環(huán)鏈表中的指定元素后面插入新結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要查找的結(jié)點(diǎn)
 * @param     data 要插入的數(shù)據(jù)
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestInsert(CircLList_t *Head, DataType_t dest, DataType_t data)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán), 單有效結(jié)點(diǎn)
        return true;
    }

    // 3.若單向循環(huán)鏈表非空,需要讓尾結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)指向首結(jié)點(diǎn)
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn), 不再繼續(xù)查找. 目標(biāo)結(jié)點(diǎn)非首結(jié)點(diǎn), 繼續(xù)向下查找
    while (Current->data != dest)
    {
        Current = Current->next;                                      // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if ((Current->next == Head->next) && (Current->data != dest)) // 達(dá)到末尾 且 末尾不是目標(biāo)
        {
            printf("The target doesn't exist! \n");
            return false;
        }
    } // 找到目標(biāo)結(jié)點(diǎn), Current此時(shí)指向目標(biāo)
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn)
    if (Current == Head->next)
    {
        New->next = Current->next; // 新結(jié)點(diǎn)鏈接目標(biāo)結(jié)點(diǎn)直接后繼
        Current->next = New;
    }
    else if (Current->next == Head->next) // 目標(biāo)結(jié)點(diǎn)是尾結(jié)點(diǎn)
    {
        New->next = Head->next; // 作為新尾結(jié)點(diǎn)
        Current->next = New;
    }
    else // 目標(biāo)結(jié)點(diǎn)是中間結(jié)點(diǎn)
    {
        New->next = Current->next; // 新結(jié)點(diǎn)鏈接目標(biāo)結(jié)點(diǎn)直接后繼
        Current->next = New;       // 目標(biāo)結(jié)點(diǎn)的直接后繼更新為新結(jié)點(diǎn)
    }
    return true;
}

/**
 * @name      CircLList_TailInsert
 * @brief     將新元素插入到尾結(jié)點(diǎn)后面
 * @param     Head 頭指針
 * @param     data 新元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 插入失敗
 *      @retval    true  插入成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_TailInsert(CircLList_t *Head, DataType_t data)
{
    CircLList_t *Phead = Head; // 備份頭結(jié)點(diǎn)地址,防止頭結(jié)點(diǎn)丟失

    // 1.創(chuàng)建新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node , Failed to create a node\n");
        return false;
    }

    // 2.判斷單向循環(huán)鏈表是否為空,如果為空,則新結(jié)點(diǎn)作為首結(jié)點(diǎn), 體現(xiàn)循環(huán)
    if (Head == Head->next)
    {
        Head->next = New; // 讓頭結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn)
        New->next = New;  // 新節(jié)點(diǎn)指向自己, 體現(xiàn)循環(huán)
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)指向首結(jié)點(diǎn)
    while (Phead->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Phead = Phead->next;           // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Phead->next == Head->next) // 當(dāng)?shù)竭_(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    }
    Phead->next = New;      // 尾結(jié)點(diǎn)指針域 鏈接 新結(jié)點(diǎn)
    New->next = Head->next; // 新結(jié)點(diǎn)指針域 指向 首結(jié)點(diǎn)

    return true;
}

/**
 * @name       CircLList_HeadDel
 * @brief     刪除頭結(jié)點(diǎn)后面的一個(gè)結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗
 *      @retval    true  刪除成功
 * @date      2024/04/24
 * @version   1.0
 * @note
 */
bool CircLList_HeadDel(CircLList_t *Head)
{
    // 1.創(chuàng)建操作指針
    // 備份頭結(jié)點(diǎn)地址,防止頭結(jié)點(diǎn)丟失
    CircLList_t *Phead = Head;
    // 備份首結(jié)點(diǎn), 用于操作
    CircLList_t *Temp = Head->next;

    // 2.判斷單向循環(huán)鏈表是否為空鏈表,如果為空, 則退出
    if (Head == Head->next)
    {
        printf("CircLList is Empty! \n");
        return false;
    }

    // 3.判斷鏈表中是否只有首結(jié)點(diǎn)

    if (Head->next == Head->next->next)
    {
        Temp->next = NULL; // 首結(jié)點(diǎn)的指針域指向NULL, 且防止野指針和內(nèi)存泄漏
        Head->next = Head; // 頭結(jié)點(diǎn)next指針指向頭結(jié)點(diǎn), 體現(xiàn)"循環(huán)"
        free(Temp);        // 釋放結(jié)點(diǎn)內(nèi)存, 防止內(nèi)存泄漏
        return true;
    }

    // 3.如果單向循環(huán)鏈表為非空,需要讓尾結(jié)點(diǎn)的next指針指向新的首結(jié)點(diǎn)(原首結(jié)點(diǎn)的直接后繼)
    while (Phead->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Phead = Phead->next;           // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Phead->next == Head->next) // 當(dāng)?shù)竭_(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    }

    Phead->next = Head->next->next; // 讓尾結(jié)點(diǎn)的next指針指向新的首結(jié)點(diǎn)(原首結(jié)點(diǎn)的直接后繼)
    Head->next = Phead->next;       // 頭結(jié)點(diǎn)的指針域 修改鏈接為 新的首結(jié)點(diǎn)
    Temp->next = NULL;              // 讓舊的首結(jié)點(diǎn)的指針域指向NULL, 從鏈表中斷開, 且防止野指針和內(nèi)存泄漏
    free(Temp);                     // 釋放舊首結(jié)點(diǎn)的內(nèi)存, 防止內(nèi)存泄漏
    return true;
}

/**
 * @name       CircLList_DestDel
 * @brief     中刪, 刪除某個(gè)元素結(jié)點(diǎn)
 * @param     Head 頭指針
 * @param     dest 要?jiǎng)h除的目標(biāo)元素
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 未找到目標(biāo)元素結(jié)點(diǎn)
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.1
 * @note
 */
bool CircLList_DestDel(CircLList_t *Head, DataType_t dest)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)
    CircLList_t *Prev = Head;          // 操作指針 存放當(dāng)前操作指針的前一個(gè)結(jié)點(diǎn)地址

    // 1.判斷單向循環(huán)鏈表是否為空,如果為空,則報(bào)錯(cuò)
    if (Head == Head->next)
    {
        printf("Error,  CircularLinkList is empty! \n");
        return false;
    }

    // 2.若單向循環(huán)鏈表非空
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn), 不再繼續(xù)查找. 目標(biāo)結(jié)點(diǎn)非首結(jié)點(diǎn), 繼續(xù)向下查找
    while (Current->data != dest)
    {
        Prev = Current;                                               // 備份Current的前一個(gè)位置
        Current = Current->next;                                      // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if ((Current->next == Head->next) && (Current->data != dest)) // 達(dá)到末尾 且 末尾不是目標(biāo)
        {
            printf("The target doesn't exist! \n");
            return false;
        }
    } // 找到目標(biāo)結(jié)點(diǎn), Current此時(shí)指向目標(biāo)  Prev為Current 的前一個(gè)位置
    // 目標(biāo)結(jié)點(diǎn)是首結(jié)點(diǎn)
    if (Current == Head->next)
    {
        // 若鏈表只有首結(jié)點(diǎn)
        if (Current->next == Head->next)
        {
            Head->next = Head; // 空鏈表狀態(tài)
            Current->next = NULL;
            free(Current); // 防止內(nèi)存泄漏
            return true;
        }
        while (Prev->next) // 不斷向下檢查結(jié)點(diǎn)指針域
        {
            Prev = Prev->next;            // 進(jìn)入下一個(gè)結(jié)點(diǎn)
            if (Prev->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
            {
                break;
            }
        } // Prev到達(dá)未尾結(jié)點(diǎn)
        Prev->next = Current->next; // 更新尾結(jié)點(diǎn)指針域?yàn)樾率捉Y(jié)點(diǎn)地址
        Head->next = Current->next; // 更新首結(jié)點(diǎn)鏈接新首結(jié)點(diǎn)
    }
    else if (Current->next == Head->next) // 目標(biāo)結(jié)點(diǎn)是尾結(jié)點(diǎn)
    {
        Prev->next = Head->next; // 新尾結(jié)點(diǎn)鏈接首結(jié)點(diǎn), 行成循環(huán)
    }
    else // 目標(biāo)結(jié)點(diǎn)是中間結(jié)點(diǎn)
    {
        Prev->next = Current->next;
    }
    Current->next = NULL;
    free(Current); // 防止內(nèi)存泄漏
    return true;
}

/**
 * @name      CircLList_TailDel
 * @brief     刪除尾結(jié)點(diǎn)
 * @param     Head 頭指針
 * @return 程序執(zhí)行成功與否
 *      @retval    false 刪除失敗, 鏈表為空
 *      @retval    true  刪除成功
 * @date      2024/04/25
 * @version   1.0
 * @note
 */
bool CircLList_TailDel(CircLList_t *Head)
{
    CircLList_t *Current = Head->next; // 操作指針 初始為指向首結(jié)點(diǎn), 若為空鏈表則指向頭結(jié)點(diǎn)
    CircLList_t *Prev = Head;          // 操作指針 存放當(dāng)前操作指針的前一個(gè)結(jié)點(diǎn)地址

    // 1.判斷單向循環(huán)鏈表是否為空,如果為空,則報(bào)錯(cuò)
    if (Head == Head->next)
    {
        printf("Error,  CircularLinkList is empty! \n");
        return false;
    }

    // 2.若單向循環(huán)鏈表非空
    // 若鏈表只有首結(jié)點(diǎn)
    if (Current->next == Head->next)
    {
        Head->next = Head; // 空鏈表狀態(tài)
        Current->next = NULL;
        free(Current); // 防止內(nèi)存泄漏
        return true;
    }
    // 若還有別的結(jié)點(diǎn)
    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        Prev = Current;
        Current = Current->next;         // 進(jìn)入下一個(gè)結(jié)點(diǎn)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
    } // Current到達(dá)未尾結(jié)點(diǎn) Prev為Current 的前一個(gè)位置
    Prev->next = Head->next; // 新尾結(jié)點(diǎn)鏈接首結(jié)點(diǎn), 行成循環(huán)
    Current->next = NULL;
    free(Current); // 防止內(nèi)存泄漏
    return true;
}
/**
 * @name      CircLList_Print
 * @brief     從頭到尾遍歷鏈表
 * @param     Head 頭指針
 * @return    無
 * @date      2024/04/23
 * @version   1.0
 * @note
 */
void CircLList_Print(CircLList_t *Head)
{
    // 判斷是否為空鏈表
    if (Head->next == Head)
    {
        printf("The list is empty.\n");
        return;
    }

    CircLList_t *Current = Head->next; // 指向首結(jié)點(diǎn)

    printf("Circular Linked List: ");

    while (Current->next) // 不斷向下檢查結(jié)點(diǎn)指針域
    {
        printf(" -> %d", Current->data); // 打印結(jié)點(diǎn)數(shù)據(jù)
        if (Current->next == Head->next) // 結(jié)束條件: 達(dá)尾結(jié)點(diǎn)
        {
            break;
        }
        Current = Current->next; // 進(jìn)入下一個(gè)結(jié)點(diǎn)
    }
    printf("\n"); // 刷新行緩沖, 輸出緩沖區(qū)
}

projecttesting.c

/**
 * @file name : projecttesting.c
 * @brief     : 實(shí)現(xiàn)單向循環(huán)鏈表的相關(guān)功能測(cè)試
 * @author    :RISE_AND_GRIND@163.com
 * @date      :2024/04/25
 * @version   :1.1
 * @note      :
 * CopyRight (c)  2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
 */

#include "CircularLinkedList.h"

int main(int argc, char const *argv[])
{
    // 創(chuàng)建單向循環(huán)鏈表, 空鏈表
    CircLList_t *Manager = CircLList_Create();

    // 頭插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_HeadInsert********************************\n");
    CircLList_HeadInsert(Manager, 7);
    CircLList_HeadInsert(Manager, 4);
    CircLList_HeadInsert(Manager, 1);
    CircLList_HeadInsert(Manager, 8);
    CircLList_HeadInsert(Manager, 5);
    CircLList_HeadInsert(Manager, 2);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 5 -> 8 -> 1 -> 4 -> 7*/

    // 中插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_DestInsert********************************\n");
    CircLList_DestInsert(Manager, 7, 9);
    CircLList_DestInsert(Manager, 4, 6);
    CircLList_DestInsert(Manager, 2, 3);
    CircLList_DestInsert(Manager, 5, 10);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9*/

    // 尾插法 向鏈表中插入新結(jié)點(diǎn)
    printf("*********************************CircLList_TailInsert********************************\n");
    CircLList_TailInsert(Manager, 13);
    CircLList_TailInsert(Manager, 12);
    CircLList_TailInsert(Manager, 11);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 2 -> 3 -> 5 -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11*/

    // 頭刪法 刪除首結(jié)點(diǎn)
    printf("*********************************CircLList_HeadDel********************************\n");
    CircLList_HeadDel(Manager);
    CircLList_HeadDel(Manager);
    CircLList_HeadDel(Manager);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 10 -> 8 -> 1 -> 4 -> 6 -> 7 -> 9 -> 13 -> 12 -> 11*/

    // 中刪法 刪除指定結(jié)點(diǎn)
    printf("*********************************CircLList_DestDel********************************\n");
    CircLList_DestDel(Manager, 10);
    CircLList_DestDel(Manager, 1);
    CircLList_DestDel(Manager, 6);
    CircLList_DestDel(Manager, 11);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 8 -> 4 -> 7 -> 9 -> 13 -> 12*/

    // 尾刪法 刪除尾結(jié)點(diǎn)
    printf("*********************************CircLList_HeadDel********************************\n");
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 8 -> 4*/
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    CircLList_TailDel(Manager);
    /*Error,  CircularLinkList is empty! */
    CircLList_HeadInsert(Manager, 66);
    CircLList_Print(Manager);
    /*Circular Linked List:  -> 66*/
    // 等待用戶響應(yīng)
    printf("***Press any key to exit the test***\n");
    getchar();
    return 0;
}

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)_鏈表_單向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語(yǔ)言實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包