#include<iostream>
using namespace std;
//-----------------单链队列——队列的链式存储结构-----------------
#define ok 1
#define error 0
#define COUNT 5
typedef int QElemType;
typedef int Status;
typedef struct QNode
{
QElemType data;
QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//对头指针
QueuePtr rear;//队尾指针
}LinkQueue;
//----------------基本操作的函数原型说明-------------------
class QueueOperation{
public:
Status InitQueue(LinkQueue &Q);//构造一个空队列Q
Status DestroyQueue(LinkQueue &Q);//销毁队列Q,Q不在
Status ClearQueue(LinkQueue &Q);//将Q清为空队列
Status QueueEmpty(LinkQueue Q);//若队列Q为空队列,则返回true,否则返回false
int QueueLength(LinkQueue Q);//返回Q的元素个数,即为队列的长度
Status GetHead(LinkQueue Q,QElemType &e);//用e返回Q的队头元素
Status EnQueue(LinkQueue &Q,QElemType e);//插入元素e为Q的新队尾元素
Status DeQueue(LinkQueue &Q,QElemType &e);//删除Q的对头元素,用e返回其值
Status QueueTraverse(LinkQueue Q,Status (*visit)(QElemType));//用visit()遍历队列Q
};//QueueOperation
Status QueueOperation::InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;
if(!Q.front)
exit(-1);
Q.front->next=NULL;
return ok;
}//InitQueue
Status QueueOperation::DestroyQueue(LinkQueue &Q)
{
while(Q.front)//从对头向队尾依次删除结点
{
Q.rear=Q.front->next;
delete Q.front;
Q.front=Q.rear;
}//while
return ok;
}//DestroyQueue
Status QueueOperation::ClearQueue(LinkQueue &Q)
{
while(Q.front->next!=NULL)
{
Q.rear=Q.front->next;
Q.front->next=Q.rear->next;
delete Q.rear;
Q.rear=Q.front->next;
}
Q.rear=Q.front;
return ok;
}//ClearQueue
Status QueueOperation::QueueEmpty(LinkQueue Q)
{
if(Q.rear==Q.front)
return ok;
else
return error;
}//QueueEmpty
int QueueOperation::QueueLength(LinkQueue Q)
{
int num=0;
Q.rear=Q.front->next;
while(Q.rear)
{
num++;
Q.rear=Q.rear->next;
}//while
return num;
}//QueueLength
Status QueueOperation::GetHead(LinkQueue Q,QElemType &e)
{
if(Q.rear==Q.front)
{
cout<<"Q为空队列"<<endl;
return error;
}//if
e=Q.front->next->data;
return ok;
}//GetHead
Status QueueOperation::EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr q=new QNode;
q->data=e;q->next=NULL;
Q.rear->next=q;
Q.rear=q;
return ok;
}//EnQueue
Status QueueOperation::DeQueue(LinkQueue &Q,QElemType &e)
{
QueuePtr q;
if(Q.rear==Q.front)
{
cout<<"Q为空队列"<<endl;
return error;
}//if
if(Q.rear==Q.front->next)//Q中只有一个元素
{
e=Q.rear->data;
delete Q.rear;
Q.rear=Q.front;
}//if
q=Q.front->next;
e=q->data;
Q.front->next=q->next;
delete q;
//q=NULL;
return ok;
}//DeQueue
Status visit(QElemType e)
{
cout<<e<<endl;
return ok;
}//visit
Status QueueOperation::QueueTraverse(LinkQueue Q,Status (*visit)(QElemType))
{
Q.rear=Q.front->next;
while(Q.rear)
{
visit(Q.rear->data);
Q.rear=Q.rear->next;
}//while
return ok;
}//QueueTraverse
void main()
{
QueueOperation QOP;
LinkQueue Q;
QElemType e;
QOP.InitQueue(Q);
Status (*vis)(QElemType);
vis=visit;
for(int i=1;i<=COUNT;i++)
{
QOP.EnQueue(Q,i);
}//for
cout<<"输出队列Q中的元素:"<<endl;
QOP.QueueTraverse(Q,vis);
cout<<"队列Q的长度Length= ";cout<<QOP.QueueLength(Q)<<endl;
cout<<"队列Q的对头元素:";
QOP.GetHead(Q,e);cout<<e<<endl;
cout<<"删除队列Q的对头元素,Q中剩余元素:"<<endl;
QOP.DeQueue(Q,e);
QOP.QueueTraverse(Q,vis);
}//main
单链队列的基本操作
最新推荐文章于 2024-07-28 19:16:57 发布