1. 程式人生 > >鏈佇列的基本操作-C語言

鏈佇列的基本操作-C語言

鏈佇列

用連結串列實現佇列的基本操作, 定義兩個指標, 分別指向連結串列的頭結點和尾節點, 即作為佇列的頭和尾, 在隊尾進行插入操作, 在對頭進行出隊操作

具體實現

定義一個鏈佇列

//定義一個佇列
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;
}

效果圖
在這裡插入圖片描述

希望本篇文章能對大家有所幫助, 真誠接受大家的評論和建議