鏈式隊列的基本操作C語言詳解

鏈式隊列有帶頭結點,和不帶頭結點的,我這裏是帶頭結點的。
邏輯結構如圖
在這裏插入圖片描述
編譯環境vc6.0,代碼如下:

/*
首元結點是指鏈表中存儲線性表中第一個數據元素的結點。
初始化:隊頭指針和隊尾指針都指向頭結點(不是首元結點)
隊滿狀態:只要還有內存,理論上不會滿
進隊操作:插入到鏈尾,尾指針指向新的尾結點
出頭操作:刪除首元結點(不是頭結點),頭指針指向新首元結點
*/

#include <stdio.h>
#include <stdlib.h>

//結點結構
typedef struct QNode
{
	int data;
	struct QNode* next;
}QNode,*Queueptr;

//鏈表結構
typedef struct
{
	Queueptr front, rear;    //對頭,隊尾指針
}LinkQueue;

//************************初始化**************************
int InitLinkQueue(LinkQueue* Q)
{
	Q->front = Q->rear = (QNode*)malloc(sizeof(QNode));			 //建立頭結點
	if (!Q->rear || !Q->front)
	{
		return 0;
		printf("動態分配內存失敗\n");
	}
	Q->front->next = NULL;										//初始化爲空
	return 1;
}

//************************判斷是否非空**************************
int IsEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)									//頭尾指針同時指向頭結點爲空
		return 1;
	else return 0;
}

//************************入隊**************************
int EnQueue(LinkQueue* Q, int e)
{
	Queueptr s = (Queueptr)malloc(sizeof(QNode));         //動態申請內存
	if (s == NULL)
		return 0;
	s->data = e;
	s->next = NULL;                                    //s插入到鏈尾巴,所有next指針指向空
	Q->rear->next = s;									//插入
	Q->rear = s;										//尾指針指向新的尾結點
	return 1;
}

//************************出隊**************************
int DeQueue(LinkQueue* Q, int* e)
{
	Queueptr p;
	if (Q->front == Q->rear)						//隊空
		return 0;
	p = Q->front->next;                           //將欲刪除的結點暫存給p
	*e = p->data;										//獲取元素值
	Q->front->next = p->next;						//刪除Q->front->next,   Q->front時頭結點,Q->front->next 時首元結點

	if (Q->rear == p)							  //若刪除後只剩下頭結點,將尾指針指向頭結點
		Q->rear = Q->front;
	free(p);
	return 1;
}

//************************遍歷輸出**************************
int LinkQueueTraverse(LinkQueue Q)
{
	Queueptr p;                   //結點指針
	if (IsEmpty(Q))
	{
		printf("鏈表爲空\n");
		return 0;
	}
	p = Q.front->next;              //p指向首元結點
	while (p)
	{
		printf("%-5d", p->data);
		p = p->next;
	}
	return 1;
}

int main()
{
	int i, e, n;						//e入隊元素,n入隊元素個數
	LinkQueue Q;
	InitLinkQueue(&Q);							//初始化
	printf("初始化成功\n");

	printf("請輸入,入隊元素個數\n");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		printf("請輸入第%d個元素值", i + 1);
		scanf("%d", &e);
		if (EnQueue(&Q, e))
			printf("入隊成功\n");
		else printf("入隊失敗\n");
	}

	if (DeQueue(&Q, &e))
		printf("\n元素%d出隊\n", e);
	else printf("出隊失敗\n");

	printf("遍歷輸出\n");
	LinkQueueTraverse(Q);
	return 0;
}

測試案例:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章