鏈式佇列的實現方式

相遇就是有缘發表於2024-08-18

C語言實現鏈佇列

LinkQueue.h

//
// Created by Administrator on 2024/8/17.
//

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include <stdbool.h>

/** 定義佇列元素結構體*/
typedef int DataType;
typedef struct LinkQueueNode {
    DataType data; //資料域
    struct LinkQueueNode *next; //指標域
} LkQueNode;

/** 定義佇列結構體*/
typedef struct LkQueue{
    LkQueNode *front; //頭指標,指向鏈隊頭結點
    LkQueNode *rear;  //尾指標,指向鏈隊最後一個結點
} LkQue;

//佇列初始化
void initQueue(LkQue *LQ);

//判斷佇列是否為空
bool EmptyQueue(LkQue *LQ);

//入佇列
void EnQueue(LkQue *LQ, DataType x);

//出佇列
void OutQueue(LkQue *LQ);

//輸出佇列首元素
void GetHead(LkQue *LQ);

//輸出佇列所有元素
void PrintEle(LkQue *LQ);

#endif //LINKQUEUE_H

LinkQueue.c

//
// Created by Administrator on 2024/8/17.
//
#include "LinkQueue.h"
#include <stdio.h>
#include "stdbool.h"
#include <stdlib.h>

//佇列初始化
void initQueue(LkQue *LQ) {
    //生成佇列頭結點並分配動態空間
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //佇列頭指標指向佇列頭結點
    LQ->front = temp;
    //佇列尾指標指向佇列尾結點
    LQ->rear = temp;
    //頭結點指向的指標域為空
    (LQ->front)->next = NULL;
}

//判斷佇列是否為空
bool EmptyQueue(LkQue *LQ) {
    if (LQ->front == LQ->rear) {
        return true;
    }
    return false;
}

//入佇列
void EnQueue(LkQue *LQ, DataType x) {
    //建立新結點並分配動態空間
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //新結點temp的資料域存放輸入的元素
    temp->data = x;
    //新結點temp的指標域設定為空
    temp->next = NULL;

    //將新結點temp插入到鏈隊最後一個結點
    (LQ->rear)->next = temp;
    LQ->rear = temp;
    printf("元素 %d 入隊成功!\n",x);
}

//出佇列
void OutQueue(LkQue *LQ) {
    //宣告結點temp存放隊頭結點資料
    LkQueNode *temp;
    //判斷鏈隊是否為空
    if (EmptyQueue(LQ)) {
        printf("隊空");
    } else {
        //隊頭資料存放到結點temp
        temp = (LQ->front)->next;
        //修改頭結點的指標域指向新的首結點,鏈隊當中剩餘資料向前移動
        (LQ->front)->next = temp->next;
        //鏈隊當中僅有一個元素時,front和rear都指向頭結點
        if (temp->next == NULL) {
            LQ->rear = LQ->front;
            printf("出隊成功,出隊元素為:%d\n", temp->data);
            //釋放結點temp空間
            free(temp);
        }
        printf("出隊成功,出隊元素為:%d\n", temp->data);
    }
}

//輸出佇列首元素
void GetHead(LkQue *LQ) {
    //判斷鏈隊是否為空
    if (EmptyQueue((LQ))) {
        printf("隊空");
    } else {
        //佇列非空,返回佇列首結點元素
        printf("隊首元素為: %d\n", LQ->front->next->data);
    }
}

//輸出佇列所有元素
void PrintEle(LkQue *LQ) {
    printf("佇列元素為:");
    LkQueNode *p;
    //判斷鏈隊是否為空
    if (EmptyQueue((LQ)))
        printf("隊空");
    //頭結點資料存放到結點p中
    p = LQ->front;
    //依次存放,直到頭結點指標域為空結束
    while (p->next != NULL) {
        p = p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

main.c

void TestLinkQueue() {
    LkQue S;
    initQueue(&S);

    DataType a[5]={2,4,6,8,10};
    for (int i=0;i<5;i++) {
        EnQueue(&S,a[i]);
    }
    PrintEle(&S);

    OutQueue(&S);

    GetHead(&S);
}

程式執行圖

image

相關文章