队列指针,语言为c++,结构体

/*
文件名称:ds.h
学号:220812049
姓名:王灿灿
完成日期:2023-04-07
*/

 #include <iostream> //c++标准输入输出  
 #include<stdio.h>   //c标准输入输出
 #include<string.h>  //c和c++字符串
#include <array>
 #include<ctype.h>   //字符库
 #include<malloc.h> /* malloc()等 */
 #include<io.h> /* eof() ,缓冲读写磁盘*/
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 #include <time.h> //时间相关库
 #include<iomanip> //cout输出控制精度用
 #include <windows.h>//GetSystemTime 获得UTC(等于GMT)时间,GetLocalTime 获得系统本地时间

/* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 #define SUCCESS 1
 #define UNSUCCESS 0
 #define DUPLICATED -1
 #define NULL_KEY 0 // 0为无记录标志

 #define MAXSIZE 50
 #define PI 3.14
 #define NUM 100

 // typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
 //Status是函数返回值的类型,其值是函数结果状态代码,如OK ERROR等 */
 typedef int Status; 

#include "ds.h"
using namespace std;

 /*******************************************************************
创建日期:2023-4 -7
修改调试记录:
1.
2.
3.
......
*******************************************************************
学号:
姓名:
文件名:LinkQueue.cpp
类描述:队列的链式存储,实现基本操作
*******************************************************************/
struct QNode
{
	int data;  //栈的最大长度
	 QNode *next;   //指向栈顶位置
};
typedef QNode *QueuePtr;   //入栈元素char型重定义为ElenType型
struct LinkQ
{
	QueuePtr front,rear;
};
 


int InitQueue(LinkQ &Q)
 { // 算法3.16 构造一个空队列Q,不用new
	 Q.front=new QNode;
	 Q.rear=Q.front;
	 Q.front->next=NULL;
	 return OK;
 }

 int DestroyQueue(LinkQ &Q)
 { // 销毁队列Q(无论空否均可)
	 QueuePtr p;
	 p=Q.front;
	 while(Q.front->next!=NULL)
	 {
		 Q.front=Q.front->next;
		 delete p;
		 p=Q.front;
	 }
	 Q.rear=NULL;
	 return OK;
 }

 int ClearQueue(LinkQ &Q)
 { // 将Q清为空队列
	 QueuePtr p,q;
	 Q.front=Q.rear;  //把尾指针赋给头指针
	 p=Q.front->next;   //使头指针指向p
	 Q.front->next=NULL;   //使头指针指向空
	 while(p)
	 {
		 q=p;
		 p=p->next;
		 delete q;
	 }
	 return OK;
 }

 int QueueEmpty(LinkQ Q)
 { // 若Q为空队列,则返回TRUE,否则返回FALSE
	 if(Q.front->next==NULL)
	 {
		 return TRUE;
	 }
	 else
	 {
		 return FALSE;
	 }

 }

 int QueueLength(LinkQ Q)
 { // 求队列的长度
	 int i=0;   //初始化,使i=0
	 QueuePtr p;
	 p=Q.front;   //使p指向头指针
	 while(p)   //如果非空
	 {
		 i++;     //i++
		 p=p->next;    //p指向下一个
	 }
	 return i;
 }

 int GetHead(LinkQ Q,int &e)//注意,与教材用函数返回值返回队头元素不同
 { // 算法3.19 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
   QueuePtr p;
   if(Q.front!=Q.rear)   //先判空
   {
	   p=Q.front->next;   //如果非空,使p指向头指针
	   e=p->data;      //把头指针的值赋给e
	   return OK;
   }
   else
   {
	   cout<<"队列为空,没有指针可以输出";
	   return ERROR;
   }
 }


 int EnQueue(LinkQ &Q,int e)
 { //算法3.17 入队,插入元素e为Q的新的队尾元素
   QueuePtr p;
   p=new QNode;  //创建一个新节点
   p->data=e;    //把插入的值赋给p
   p->next=NULL;    //让插入的p指向空
   Q.rear->next=p;    //让rear下一个指向p
   Q.rear=p;    //把p赋给rear,使rear始终指向尾部
   return OK;
 }

 int DeQueue(LinkQ &Q,int &e)
 { // 算法3.18 出队,若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
   QueuePtr p;
   if(Q.rear!=Q.front)   //如果队列非空
   {
	   p=Q.front->next;    //使头指针指向p
	   e=p->data;         //把头指针的值赋给e;
	   Q.front->next=p->next;       //把p下一个指针赋给头指针,使头指针始终指向头部
	   if(Q.rear==p)     //如果删除的p刚好等于最后一个指针
	   {
		   Q.rear=Q.front;    //最后一个指针被删,尾指针指向头部

	   }
	   delete p;    //释放p的空间
	   //p=NULL;
	   return OK;
   }
   else
   {
	   return ERROR;
   }
 }

 void QueueTraverse(LinkQ Q)
 { // 遍历,从队头到队尾依次对队列Q中每个元素s输出
   QueuePtr p;
   p=Q.front->next;   //p指向头指针
   while(p)
   {
	   cout<<p->data<<",";   //输出p的值
	   p=p->next;     //使p指向下一个
   }
 }


 void main()
 {
	cout<<"220812049"<<"王灿灿 40min:";	
	system("date /t");
	system("time /t");
	LinkQ s1;
	int e,m,n;    
	InitQueue(s1);  //进行初始化
	int i;
	int value;
	//1.测试输入输出
	InitQueue(s1);  //初始化 
	cout<<"如果队空则为1,不空则为0: "<<QueueEmpty(s1)<<endl;  //测试空函数
	cout<<"请输入入队元素的个数:";
	cin>>n;
	cout<<endl;
	cout<<"请输入要入队的元素:";
	for(i=0;i<n;i++)
	{
		cin>>m;
		EnQueue(s1,m);   //通过for循环给栈赋值,看看入栈函数是否正确
	}
	cout<<"当前队内元素为: ";
	QueueTraverse(s1);   //判断输出栈函数
	cout<<endl;
	GetHead(s1,value);  //获取栈顶值
	cout<<"当前队顶元素为:"<<value<<endl;
	DeQueue(s1,e);
    cout<<"队顶元素出队后有"<<"“"<<QueueLength(s1)<<"”"<<"个元素,分别为: ";
	QueueTraverse(s1);
	cout<<endl;
    GetHead(s1,value);  //获取队顶值元素
	cout<<"队顶元素为:"<<value<<endl;
	cout<<"清空队后:\n";
	ClearQueue(s1);//清空队,只是清空数据 
	cout<<"如果队空则为1,不空则为0: "<<QueueEmpty(s1)<<endl;  //测试空函数
	//测试清除和销毁的区别
	//清空后未初始化
	cout<<"清空队重新输入:  \n";
	for(i=12;i<20;i++)
	{
		EnQueue(s1,i);   //通过for循环给栈赋值,看看入栈函数是否正确
	}
	cout<<"出队后有"<<"“"<<QueueLength(s1)<<"”"<<"个元素,分别为: ";
	QueueTraverse(s1);
	cout<<"\n销毁栈后,如果销毁成功则为1:"<<DestroyQueue(s1)<<endl;
	InitQueue(s1); 
	for(i=12;i<20;i++)
	{
		EnQueue(s1,i);   //通过for循环给栈赋值,看看入栈函数是否正确
	}
	cout<<"出队后有"<<"“"<<QueueLength(s1)<<"”"<<"个元素,分别为: ";
	QueueTraverse(s1);
	cout<<"如果队空则为1,不空则为0: "<<QueueEmpty(s1)<<endl;  //测试空函数
}
	
	
  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光无声841

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值