带头结点的链式队列的基本操作

本文介绍了队列这一线性数据结构的基本概念和特点,包括其FIFO(先进先出)的原则。通过C++代码展示了如何实现链表结构的队列,包括初始化、判断队列是否为空、入队、出队和打印队列元素等操作。此外,代码还包含了一个简单的示例来演示队列的使用,如入队元素和出队元素的过程。
摘要由CSDN通过智能技术生成

队列

队列也是一种受限的线性结构,只能在头出,尾进,如下图为其存储模式,一定要将指针方向搞明白了,因为出队是在队头操作,出队后我们需要明白下一个是谁就必须知道出队前下一个是谁,这样来看就是队头指向队尾了,而头结点还是只是一个特殊结点,无具体的data

具体代码实现

有特殊需要可自行修改

#include<bits/stdc++.h>
using namespace std;
typedef struct Linknode { //定义队列结点
	int data;
	struct Linknode* next;
}Linknode;
typedef struct Linkqueue {  //队列
	Linknode* front, * rear;  //队列的头指针和尾指针,注意和双链表区别开,这里front和rear是单独的
}Linkqueue;

void Initqueue(Linkqueue& Q) //初始化
{
	Q.front = Q.rear = (Linknode*)malloc(sizeof(Linknode));
	Q.front->next = NULL;
}

bool Emptyqueue(Linkqueue Q)//判空
{
	if (Q.front == Q.rear)
		return true;
	return false;
}

bool Push(Linkqueue& Q, int e) //入队,对rear操作,理解为入队肯定是在队伍尾端进入
{
	Linknode* p = (Linknode*)malloc(sizeof(Linknode));
	if (!p)
		return false;//分配空间错误!内存不足
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	return true;
}

bool Pop(Linkqueue& Q, int& e) //出队,对于front操作
{
	if (Emptyqueue(Q) == 1)
		return false;
	Linknode* p = (Linknode*)malloc(sizeof(Linknode)); //p结点用来释放结点空间
	p = Q.front->next;
	e = p->data;
	Q.front ->next= p->next;
	free(p);
	return true;
}

void Printqueue(Linkqueue Q)
{
	if (Emptyqueue(Q) == 1)
		cout << "队列为空!" << endl;
	else
	{
		Linknode*p=Q.front->next; //跳过头结点
		while (p!=NULL)
		{
			cout << p->data << " ";  //遵循队列先进先出原则输出
			p = p->next;
		}
		cout << endl;
	}
}

int main()
{
	Linkqueue Q;
	Initqueue(Q);
	Push(Q, 1);
	Push(Q, 2);
	Push(Q, 3);
	Printqueue(Q);
	int e = 0;
	Pop(Q, e);
	cout << "出队一次的数据为:" << e << endl;
	Printqueue(Q);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值