C++ 数据结构 队列的链式存储基本的算法

具体代码的解释写在代码注释里了

#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std; 

typedef int ElemType;
struct LNode{
	ElemType data;//值域 
	LNode* next;//链接指针域 
};

struct LinkQueue{
	LNode* front;//队首指针 
	LNode* rear;//队尾指针 
}; 

//1.初始化队列
void InitQueue(LinkQueue& HQ){
	HQ.front=HQ.rear=NULL;
} 
//2.向链队中插入一个元素
void EnQueue(LinkQueue& HQ,ElemType item){
	LNode* newptr=new LNode;//得到一个新结点
	newptr->data=item;
	newptr->next=NULL;//新结点指针域置空
	if(HQ.rear==NULL)
	   HQ.front=HQ.rear=newptr;//若链队为空的话,则新结点既是队首又是队尾 
	else//若链队非空,则新结点被链接到队尾,并且修改队尾指针 
	   HQ.rear=HQ.rear->next=newptr; 
} 
//3.从链队中删除一个元素
ElemType OutQueue(LinkQueue& HQ){
	//判空
	if(HQ.front==NULL){
		cerr<<"链队为空,无法删除!"<<endl;
		exit(1);
	} 
	ElemType temp=HQ.front->data;//temp暂存队首元素的值
	LNode* p=HQ.front;//暂存队首指针以便回收队首结点
	HQ.front=p->next;//修改队首指针,使其指向下一个结点
	if(HQ.front==NULL)
	  HQ.rear=NULL;//若删除之后链队为空,则使队尾指针为空 
	  
	delete p;
	return temp; 
} 

//4.读取队首元素
ElemType PeekQueue(LinkQueue& HQ){
	if(HQ.front==NULL){
		cerr<<"链队队首无元素!"<<endl;
		exit(1);
	} 
	return HQ.front->data;
} 

//5.检查链队是否为空
bool EmptyQueue(LinkQueue& HQ){
	return HQ.rear==NULL; 
} 

//6.清除链队中的所有元素,使其成为一个空队
 void ClearQueue(LinkQueue& HQ){
    LNode* p=HQ.front;//队首指针赋给p
	while(p!=NULL){/*依次删除链队里的每一个结点,循环结束后,队首指针已经为空!*/
		HQ.front=HQ.front->next;
		delete p;
		p=HQ.front;
	} 
	HQ.rear=NULL;
 }

main(){
	LinkQueue q;
	InitQueue(q);
	int a[9]={3,8,5,17,9,30,15,22,20};
    int i;
    for(i=0;i<9;i++) EnQueue(q,a[i]);//通过for循环将数组内的数字依次进链队
    
    cout<<OutQueue(q)<<" ";//删除并且返回链队中最先进链队的数值,应为3
    cout<<OutQueue(q)<<" ";//现在再删除并且返回队首的值,应为8
    cout<<OutQueue(q)<<endl;//再次删除并且返回队首的值,应为5
    
    EnQueue(q,68);//将68进链队,在队尾,此时队列应为17,9,30,15,22,20,68
    for(i=0;i<9;i+=2) EnQueue(q,a[i]);//将数组中的元素隔一个进一个链队,之后链队应为17,9,30,15,22,20,68,3,5,9,15,20
	cout<<PeekQueue(q)<<" ";//读取队首元素,17
	cout<<OutQueue(q)<<endl;//删除并且返回当前队首的值,17
	
	while(!EmptyQueue(q))
	  cout<<OutQueue(q)<<' ';//当队列不为空时,删除并且返回当前队首的值,直到队列删为空,依次删除的是9,30,15,22,20,68,3,5,9,15,20
	cout<<endl;
	ClearQueue(q);//清除链队的所有元素
} 

运行结果如下:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值