算法与数据结构之链式队列

本文探讨了队列的特性,特别是其先进先出(FIFO)的概念,并重点介绍了链式队列的实现方式。
摘要由CSDN通过智能技术生成

队列

和栈相反,队列是一种先进先出的线性表,简称FIFO结构,它只允许在表的一端进行删除元素,另一端进行插入元素,允许插入的一端称为队尾,允许删除的一端称为队头

链式队列的实现

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

//队列的链式存储结构
typedef struct Node
{
	int data;
	struct Node *pNext;
}NODE,*PNODE;

typedef struct Queue
{
	PNODE front;	//队头指针
	PNODE rear;		//队尾指针
}QUEUE,*PQUEUE;

void Init(PQUEUE pQ);//构造一个空队列
void Destroy(PQUEUE pQ);//销毁队列
void Clear(PQUEUE pQ);//清空队列
bool Empty(PQUEUE pQ);//判断队列是否为空
int Length(PQUEUE pQ);//返回队列长度
bool GetHead(PQUEUE pQ,int *e);//用e返回队头元素
void Enqueue(PQUEUE pQ,int val);//入队
bool Dequeue(PQUEUE pQ,int *e);//出队,用e返回其值
void Traverse(PQUEUE pQ);//遍历队列中的元素

int main()
{
	int val;
	QUEUE Q;
	Init(&Q);
	if(Empty(&Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	printf("入队后的元素为:");
	Enqueue(&Q,1);
	Enqueue(&Q,2);
	Enqueue(&Q,3);
	Enqueue(&Q,4);
	Enqueue(&Q,5);
	Enqueue(&Q,6);
	Traverse(&Q);
	GetHead(&Q,&val);
	printf("队头的元素为:%d\n",val);
	Dequeue(&Q,&val);
	printf("出队的元素为:%d\n",val);
	Dequeue(&Q,&val);
	printf("出队的元素为:%d\n",val);
	Dequeue(&Q,&val);
	printf("出队的元素为:%d\n",val);
	Clear(&Q);
	if(Empty(&Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	Destroy(&Q);
	return 0;
}

void Init(PQUEUE pQ)
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(NULL == pHead)
		exit(-1);
	pQ->front = pHead;
	pQ->rear = pHead;
	pHead->pNext = NULL;
}
void Destroy(PQUEUE pQ)
{
	while(pQ->front != NULL)
	{
		pQ->rear = pQ->front->pNext;
		free(pQ->front);
		pQ->front = pQ->rear;
	}
}
void Clear(PQUEUE pQ)
{
	PNODE p = pQ->front->pNext,q;
	while(p != NULL)
	{
		q = p->pNext;
		free(p);
		p = q;
	}
	pQ->rear = pQ->front;
	pQ->front->pNext = NULL;
}
bool Empty(PQUEUE pQ)
{
	if(pQ->front == pQ->rear)
		return true;
	else
		return false;
}
int Length(PQUEUE pQ)
{
	int count = 0;
	PNODE p = pQ->front->pNext;
	while(p != NULL)
	{
		count++;
		p = p->pNext;
	}
	return count;
}
bool GetHead(PQUEUE pQ,int *e)
{
	PNODE p;
	if(pQ->front == pQ->rear)
		return false;
	p = pQ->front->pNext;
	*e = p->data;
	return true;
}
void Enqueue(PQUEUE pQ,int val)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(NULL == pNew)
		exit(-1);
	pNew->data = val;
	pNew->pNext = NULL;
	pQ->rear->pNext = pNew;
	pQ->rear = pNew;
}
bool Dequeue(PQUEUE pQ,int *e)
{
	PNODE p;
	if(pQ->front == pQ->rear)
		return false;
	p = pQ->front->pNext;
	*e = p->data;
	pQ->front->pNext = p->pNext;
	if(p == pQ->rear)
		pQ->rear = pQ->front;
	free(p);
	return true;
}
void Traverse(PQUEUE pQ)
{
	PNODE p = pQ->front->pNext;
	while(p != NULL)
	{
		printf("%d	",p->data);
		p = p->pNext;
	}
	printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值