/*
文件名称: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; //测试空函数
}
队列指针,语言为c++,结构体
最新推荐文章于 2024-06-15 16:46:40 发布