链队列的实现

目录

1.队列的链式存储结构

2.链队的初始化

3.链队的入队

4.出队

5.取队头元素

6.销毁队列与清空队列

7.队列的判空

8.求队列长度

9.遍历队列


1.队列的链式存储结构

#include <iostream>
using namespace std;
#define QElemType int
#define Status int

typedef struct QNode
{
	QElemType data;
	struct QNode* next;
}QNode,*QueuePtr;

typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

2.链队的初始化

Status InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//生产新结点作为头结点,队头和队尾指针指向此结点
	if (!Q.front)
		exit(_OVERFLOW);
	Q.front->next = NULL;//头结点的指针域置空
	return 1;
}

3.链队的入队

Status EnQueue(LinkQueue& Q, QElemType e)
{
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//为入队元素分配节点空间,用指针p指向
	if (!p)
		exit(_OVERFLOW);
	p->data = e;       //将新结点数据域置为e
	p->next = NULL;    //将新结点插入到队尾
	Q.rear->next = p;  
	Q.rear = p;        //修改队尾指针
	return 1;
}

4.出队

Status DeQueue(LinkQueue& Q, QElemType& e)
{
	QueuePtr p;
	if (Q.front == Q.rear)            
		return 0;
	p = Q.front->next;             //p指向队头元素
	e = p->data;                   //e保存队头元素的值
	Q.front->next = p->next;       //修改头结点的指针域
	if (Q.rear == p)               //最后一个元素被删,队尾指针指向头结点
		Q.rear = Q.front;
	free(p);                       //释放原队头元素的空间
	return 1;
}

5.取队头元素

Status GetHead(LinkQueue Q, QElemType& e)
{
	QueuePtr p;
	if (Q.front == Q.rear)
		return 0;
	p = Q.front->next;       //返回队头元素,队头指针不变
	e = p->data;
	return 1;
}

6.销毁队列与清空队列

Status DestroyQueue(LinkQueue& Q)
{
	while (Q.front)
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	return 1;
}

Status ClearQueue(LinkQueue& Q)
{
	QueuePtr p, q;
	Q.rear = Q.front;
	p = Q.front->next;
	Q.front->next = NULL;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
	return 1;
}

7.队列的判空

Status QueueEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
		return 1;
	else
		return 0;
}

8.求队列长度

int QueueLength(LinkQueue Q)
{
	int i = 0;
	QueuePtr p;
	p = Q.front;
	while (Q.rear != p)
	{
		i++;
		p = p->next;
	}
	return i;
}

9.遍历队列

void visit(QElemType a)
{
	cout << a << " ";
}

Status QueueTraverse(LinkQueue& Q, void (*visit)(QElemType))
{
	QueuePtr p;
	p = Q.front->next;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
	cout << endl;
	return 1;
}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值