鏈佇列的基本操作-C語言
阿新 • • 發佈:2018-12-30
鏈佇列
用連結串列實現佇列的基本操作, 定義兩個指標, 分別指向連結串列的頭結點和尾節點, 即作為佇列的頭和尾, 在隊尾進行插入操作, 在對頭進行出隊操作
具體實現
定義一個鏈佇列
//定義一個佇列
typedef int ElemType;
//連結串列的定義
typedef struct QNode {
ElemType data;
struct QNode* next;
}QNode, *QueuePtr;
//隊頭和隊尾指標的定義
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
初始化鏈佇列
//佇列的初始化
void InitQueue(LinkQueue* L) {
L->front = (QueuePtr)malloc(sizeof(QNode));
if (!L->front) {
exit(0);
}
L->rear = L->front;
L->front->next = NULL;
}
鏈佇列的入隊操作
//入佇列操作
int InQueue(LinkQueue* L, ElemType e) {
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p) {
exit(0);
}
p->data = e;
//從隊尾入隊, 其下一個結點為NULL
p->next = NULL;
//連線佇列
L->rear->next = p;
//調整隊尾指標, 使其始終指向隊尾
L->rear = p;
return 1;
}
鏈佇列的出隊操作
//出佇列操作
int OutQueue(LinkQueue* L, int* e) {
if (L->front == L->rear) {
//printf("佇列為空\n");
return 0;
}
//定義一個調整指標來儲存被釋放的結點, 即隊頭的下一個元素
QueuePtr adjust = L->front->next;
//儲存要出隊的值
*e = adjust->data;
//如果出隊後佇列為空, 調整尾指標
if (L->rear == L->front->next) {
L->rear = L->front;
}
//連線佇列
L->front->next = adjust->next;
free(adjust);
return 1;
}
佇列的銷燬
void destroyQueue(LinkQueue* L) {
while (L->front) {
//隊尾指標始終指向隊頭指標的下一個元素
L->rear = L->front->next;
//釋放隊頭結點
free(L->front);
//調整隊頭位置
L->front = L->rear;
}
//銷燬後, 隊頭和隊尾指標都為NULL
}
佇列的清空
//清空一個佇列
void ClearQueue(LinkQueue* L) {
//先將隊尾指標指向隊頭指標的下一個結點
L->rear = L->front->next;
while (L->front->next) {
//隊尾指標後移
L->rear = L->rear->next;
//釋放隊頭指標和隊尾指標中間的結點
free(L->front->next);
//連線佇列
L->front->next = L->rear;
}
//佇列為空時, 調整隊尾指標
L->rear = L->front;
}
測試
#include <stdio.h>
#include <windows.h>
/*
用動態連結串列實現一個鏈佇列
*/
//定義一個佇列
typedef int ElemType;
//連結串列的定義
typedef struct QNode {
ElemType data;
struct QNode* next;
}QNode, *QueuePtr;
//隊頭和隊尾指標的定義
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//佇列的初始化
void InitQueue(LinkQueue* L) {
L->front = (QueuePtr)malloc(sizeof(QNode));
if (!L->front) {
exit(0);
}
L->rear = L->front;
L->front->next = NULL;
}
//入佇列操作
int InQueue(LinkQueue* L, ElemType e) {
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p) {
exit(0);
}
p->data = e;
//從隊尾入隊, 其下一個結點為NULL
p->next = NULL;
//連線佇列
L->rear->next = p;
//調整隊尾指標, 使其始終指向隊尾
L->rear = p;
return 1;
}
//出佇列操作
int OutQueue(LinkQueue* L, int* e) {
if (L->front == L->rear) {
//printf("佇列為空\n");
return 0;
}
//定義一個調整指標來儲存被釋放的結點, 即隊頭的下一個元素
QueuePtr adjust = L->front->next;
//儲存要出隊的值
*e = adjust->data;
//如果出隊後佇列為空, 調整尾指標
if (L->rear == L->front->next) {
L->rear = L->front;
}
//連線佇列
L->front->next = adjust->next;
free(adjust);
return 1;
}
void destroyQueue(LinkQueue* L) {
while (L->front) {
//隊尾指標始終指向隊頭指標的下一個元素
L->rear = L->front->next;
//釋放隊頭結點
free(L->front);
//調整隊頭位置
L->front = L->rear;
}
//銷燬後, 隊頭和隊尾指標都為NULL
}
//清空一個佇列
void ClearQueue(LinkQueue* L) {
//先將隊尾指標指向隊頭指標的下一個結點
L->rear = L->front->next;
while (L->front->next) {
//隊尾指標後移
L->rear = L->rear->next;
//釋放隊頭指標和隊尾指標中間的結點
free(L->front->next);
//連線佇列
L->front->next = L->rear;
}
//佇列為空時, 調整隊尾指標
L->rear = L->front;
}
int main(){
LinkQueue L1;
InitQueue(&L1);
for (int i = 0; i < 5; ++i) {
if (InQueue(&L1, i + 1));
}
int e = 0;
for (int i = 0; i < 5; ++i) {
if (OutQueue(&L1, &e)) {
printf("%d ", e);
}
}
printf("\n");
destroyQueue(&L1);
if (!L1.front) {
printf("OK\n");
}
system("pause");
return 0;
}
效果圖
希望本篇文章能對大家有所幫助, 真誠接受大家的評論和建議