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);
}
程式執行圖