队列的一些基本操作
初始化队列
Status InitQueue(LinkQueue &q)
{
q.front=q.rear=(QueuePtr)malloc(sizeof(QNode));//申请空间
if(!q.front)//内存不够,申请失败
exit(OVERFLOW);
q.front->next=NULL;//队头指针指向空
return OK;
}
销毁队列
Status DestroyQueue(LinkQueue &q){
while(q.front){
q.rear=q.front->next;
free(q.front);
q.front=q.rear;
}
return OK;
}
清空队列
Status ClearQueue(LinkQueue &q)
{
QueuePtr p1,p2;
q.rear=q.front;
p1=q.front->next;
q.front->next=NULL;
while(p1)
{
p2=p1;
p1=p1->next;
free(p2);
}
return OK;
}
队列判空
Status EmptyQueue(LinkQueue &q)
{
if(q.front->next==NULL)
return 1;
else
return 0;
}
求队列长度
Status LengthQueue(LinkQueue &q)
{
int len=0;
QueuePtr p=q.front;
while(q.rear!=p)
{
len++;
p=p->next;
}
return len;
}
取队头元素
Status GetHead(LinkQueue Q,QElemType &e)
{
QueuePtr p;
if(q.front==q.rear)//队列为空,退出
return ERROR;
p=q.front->next;
e=p->data;
return OK;
}
入队
Status InsertQueue(LinkQueue &q,QElemType e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
q.rear->next=p;//插入队尾
q.rear=p;//更新队尾
return OK;
}
出队
Status DeleteQueue(LinkQueue &q,QElemType &e){
QueuePtr p;
if(q.front==q.rear)
return ERROR;//队列为空了
p=q.front->next;//取队头元素位置
e=p->data;//取队头值
q.front->next=p->next;//更新队头元素
if(q.rear==p)//出队是队尾元素情况
q.rear=q.front;
free(p);//释放p
return OK;
}
输出队列
Status ShowQueue(LinkQueue &q)
{
QueuePtr p=q.front->next;
while(p)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
return OK;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define Listsize 100
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int init=0,des=0;
LinkQueue q;
Status InitQueue(LinkQueue &q)
{
q.front=q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!q.front )
exit(OVERFLOW);
q.front->next=NULL;
return OK;
}
Status DestroyQueue(LinkQueue &q){
while(q.front){
q.rear=q.front->next;
free(q.front);
q.front=q.rear;
}
return OK;
}
Status ClearQueue(LinkQueue &q)
{
QueuePtr p1,p2;
q.rear=q.front;
p1=q.front->next;
q.front->next=NULL;
while(p1)
{
p2=p1;
p1=p1->next;
free(p2);
}
return OK;
}
Status InsertQueue(LinkQueue &q,QElemType e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
return OK;
}
Status DeleteQueue(LinkQueue &q,QElemType &e){
QueuePtr p;
if(q.front==q.rear)
return ERROR;
p=q.front->next;
e=p->data;
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
free(p);
return OK;
}
Status EmptyQueue(LinkQueue &q)
{
if(q.front->next==NULL)
return 1;
else
return 0;
}
Status LengthQueue(LinkQueue &q)
{
int len=0;
QueuePtr p=q.front;
while(q.rear!=p)
{
len++;
p=p->next;
}
return len;
}
Status GetHead(LinkQueue Q,QElemType &e)
{
QueuePtr p;
if(q.front==q.rear)
return ERROR;
p=q.front->next;
e=p->data;
return OK;
}
Status ShowQueue(LinkQueue &q)
{
QueuePtr p=q.front->next;
while(p)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
return OK;
}
int main()
{
int order,len,e;
cout<<"*--------------队列--------------*"<<endl;
cout<<"*---------1.初始化队列-----------*"<<endl;
cout<<"*---------2.销毁队列-------------*"<<endl;
cout<<"*---------3.清空队列-------------*"<<endl;
cout<<"*---------4.队列判空-------------*"<<endl;
cout<<"*---------5.求队列长度-----------*"<<endl;
cout<<"*---------6.获取队头元素---------*"<<endl;
cout<<"*---------7.入队-----------------*"<<endl;
cout<<"*---------8.出队-----------------*"<<endl;
cout<<"*---------9.输出所有元素---------*"<<endl;
do{
cout<<"请输入指令"<<endl;
cin>>order;
if(order==0 || order>9)
cout<<"没有该指令"<<endl;
else if(!init && order>1)
cout<<"请先初始化队列"<<endl;
else if(des && order>1)
cout<<"队列已销毁,请先初始化"<<endl;
else
switch(order)
{
case 1:
InitQueue(q);
init=1;
des=0;
cout<<"初始化队列完成"<<endl;
break;
case 2:
DestroyQueue(q);
des=1;
cout<<"队列已销毁"<<endl;
break;
case 3:
ClearQueue(q);
cout<<"队列已清空"<<endl;
break;
case 4:
if(!EmptyQueue(q))
cout<<"队列非空"<<endl;
else
cout<<"队列为空"<<endl;
break;
case 5:
len=LengthQueue(q);
cout<<"队列长度为:"<<len<<endl;
break;
case 6:
if(!GetHead(q,e))
cout<<"队列为空"<<endl;
else
cout<<"队头元素为"<<e<<endl;
break;
case 7:
cout<<"请输入插入元素:";
cin>>e;
InsertQueue(q,e);
cout<<"入队成功"<<endl;
break;
case 8:
if(DeleteQueue(q,e))
cout<<"出队成功"<<endl;
else
cout<<"队列为空"<<endl;
break;
case 9:
cout<<"队列为:"<<endl;
ShowQueue(q);
break;
default:
cout<<"程序已退出"<<endl;
break;
}
}while(order>=0);
return 0;
}
篇末寄语:优秀的人,背后都是自虐式的自律。