單向鏈式佇列

Zeratul$$$發表於2024-04-26

目錄

目錄
  • 單向鏈式佇列
  • 建立空連結串列
  • 建立新結點
  • 入隊
  • 判斷連結串列是否為空
  • 出隊
  • 遍歷
  • 程式碼驗證

單向鏈式佇列

/**

  • @file name: main.c
  • @brief 單向鏈式佇列
  • @author 1810866453@163.com
  • @date 2024/04/23
  • @version 1.0 :版本
  • @property :屬性介紹
  • @note 補充 注意 說明
  • CopyRight (c) 2023-2024 RISE_AND_GRIND@163.com All Right Reseverd
    */
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 指的是迴圈佇列中的元素的資料型別,使用者可以根據需要進行修改
typedef int DataType_t;

// 構造記錄迴圈佇列CircularQueue各項引數(迴圈佇列的首地址 + 迴圈佇列的容量 + 迴圈佇列隊尾下標+隊首下標)的結構體
typedef struct LinkQueue
{
    DataType_t data;        // 結點的資料域
    struct LinkQueue *next; // 結點的指標域
    struct LinkQueue *Rear;
    struct LinkQueue *Front;

} LinkQueue_t;

建立空連結串列

// 建立一個空連結串列,空連結串列應該有一個頭結點,對連結串列進行初始化
/**
 * @function name:	LList_Create
 * @brief  建立一個空連結串列,空連結串列應該有一個頭結點,對連結串列進行初始化
 * @param  介紹函式引數 void
 * @retval void
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
LinkQueue_t *LList_Create(void)
{
    // 1.建立一個頭結點並對頭結點申請記憶體
    LinkQueue_t *Head = (LinkQueue_t *)calloc(1, sizeof(LinkQueue_t));
    if (NULL == Head)
    {
        perror("Calloc memory for Head is Failed");
        exit(-1);
    }

    // 2.對頭結點進行初始化,頭結點是不儲存有效內容的!!!
    Head->next = NULL;
    Head->Front = NULL;
    Head->Rear = NULL;

    // 3.把頭結點的地址返回即可
    return Head;
}

建立新結點

// 建立新的結點,並對新結點進行初始化(資料域 + 指標域)
/**
 * @function name:	LList_Create
 * @brief  建立新的結點,並對新結點進行初始化
 * @param  介紹函式引數 @data:新結點資料
 * @retval 新結點地址
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
LinkQueue_t *LList_NewNode(DataType_t data)
{
    // 1.建立一個新結點並對新結點申請記憶體
    LinkQueue_t *New = (LinkQueue_t *)calloc(1, sizeof(LinkQueue_t));
    if (NULL == New)
    {
        perror("Calloc memory for NewNode is Failed");
        return NULL;
    }

    // 2.對新結點的資料域和指標域進行初始化
    New->data = data;
    New->next = NULL;
    New->Front = NULL;
    New->Rear = NULL;

    return New;
}

入隊

// 入隊

/**
 * @function name:	LList_Create
 * @brief  入隊
 * @param  介紹函式引數 @Head:頭結點地址  @data:新結點資料
 * @retval bool
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
bool LinkQueue_Enqueue(LinkQueue_t *Head, DataType_t data)
{
    LinkQueue_t *New = LList_NewNode(data);
    LinkQueue_t *Phead = Head;
    // 判斷新節點是否建立成功
    if (NULL == New)
    {
        printf("can not insert new node\n");
        return false;
    }
    // 判段連結串列是否為空,為空則可以直接插入
    if (Head->next == NULL)
    {
        Head->next = New;
        Head->Front = New;
        Head->Rear = New;
        return true;
    }
    // 遍歷找到尾結點
    while (Phead->next)
    {
        Phead = Phead->next;
    }
    // 進行入隊操作
    Head->Front = Head->next;
    Phead->next = New;
    Head->Rear = New;
    return true;
}

判斷連結串列是否為空

/**
 * @function name:	LList_Create
 * @brief  判斷迴圈佇列是否為空
 * @param  介紹函式引數 @Head:頭結點地址
 * @retval bool
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
// 判斷迴圈佇列是否為空
bool LinkQueue_IsEmpty(LinkQueue_t *Head)
{
    return (Head->next == NULL) ? true : false;
}

出隊

// 出隊
/**
 * @function name:	LList_Create
 * @brief  出隊
 * @param  介紹函式引數 @Head:頭結點地址
 * @retval 出隊資料
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
// 判斷迴圈佇列是否為空
DataType_t LinkQueue_Dequeue(LinkQueue_t *Head)
{
    DataType_t temp = 0;
    LinkQueue_t *Phead = Head->next;
    // 1.判斷迴圈佇列是否為空
    if (LinkQueue_IsEmpty(Head))
    {
        return -1;
    }
    // 判斷連結串列是否只有一個結點
    else if (Head->next->next == NULL)
    {
        temp = Phead->data;
        Head->next = NULL;
        Phead->next = NULL;
        free(Phead);
        return temp;
    }
    temp = Phead->data;
    Head->next = Head->next->next;
    Head->Front = Head->next->next;
    Phead->next = NULL;
    free(Phead);
    return temp;
}

遍歷

/**
 * @function name:	LList_Create
 * @brief  遍歷
 * @param  介紹函式引數 @Head:頭結點地址
 * @retval 出隊資料
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   補充 注意 說明
 */
// 判斷迴圈佇列是否為空
void LinkQueue(LinkQueue_t *Head)
{
    // 對連結串列的標頭檔案的地址進行備份
    LinkQueue_t *Phead = Head;

    // 首結點
    while (Phead->next)
    {
        // 把頭的直接後繼作為新的頭結點
        Phead = Phead->next;

        // 輸出頭結點的直接後繼的資料域
        printf("data = %d\n", Phead->data);
    }
}

程式碼驗證

int main(int argc, char const *argv[])
{
    struct LinkQueue *Manager = LList_Create();

    LinkQueue_Enqueue(Manager, 1);
    LinkQueue_Dequeue(Manager);
    LinkQueue_Enqueue(Manager, 2);
    LinkQueue_Enqueue(Manager, 3);
    LinkQueue_Enqueue(Manager, 4);
    LinkQueue_Dequeue(Manager);
    LinkQueue(Manager);
    return 0;
}

相關文章