链队列
先进先出
队列的表示和实现:
- 链队列:链式存储
- 循环队列:顺序存储
这里我们来说链队列的基本操作
- 清空链队列
- 判断链队列是否为空
- 求链队列长度
- 显示链队列队头位置元素
- 队尾入队
- 队头出队
- 显示链队列
代码如下:
#include <iostream>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
using namespace std;
typedef int QElemType_L;
typedef int Status;
//定义队列的结点
typedef struct QNode
{
QElemType_L data;
struct QNode *next;
}QNode,*QueuePtr;
//定义链队列
typedef struct
{
QueuePtr front;//头指针
QueuePtr rear;//尾指针
}LinkQueue;
//初始化
Status InitQueue_L(LinkQueue &Q)
{
Q.front = Q.rear = new QNode;
Q.front->next = NULL;
return OK;
}
//销毁队列
Status DestoryQueue (LinkQueue &Q)
{
while (Q.front)
{
Q.rear = Q.front->next;
delete Q.front;
Q.front = Q.rear;
}
return OK;
}
//清空队列
void ClearQueue_L(LinkQueue &Q)
{
Q.rear = Q.front->next;
while(Q.rear)
{
Q.front->next = Q.rear->next;
free(Q.rear);
Q.rear = Q.front->next;
}
Q.rear = Q.front;
cout << "清空成功"<<endl;
}
//判断是否为空
void QueueEmpty_L(LinkQueue Q)
{
if (Q.front == Q.rear)
cout<<"链队列为空"<<endl;
else
cout<<"链队列不为空"<<endl;
}
//求链队列长度
int QueueLength_L(LinkQueue Q)
{
int count = 0;
QueuePtr p = Q.front;
while(p!=Q.rear)
{
count++;
p = p->next;
}
return count;
}
//显示链队列
void QueueTraverse_L(LinkQueue Q)
{
QueuePtr p;
p = Q.front->next;
cout<<"链队列中的元素为:";
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
//入队
Status EnQueue(LinkQueue &Q)
{
int n,e;
cout<<"请输入要入队的元素个数:"<<endl;
cin>>n;
cout<<"请依次输入要入队的元素:"<<endl;
for (int i=0;i<n;i++)
{
cin>>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;
}
cout<<"入队成功"<<endl;
return OK;
}
//获取队头元素
Status GetHead_L(LinkQueue Q)
{
QueuePtr p;
QElemType_L e;
if (Q.front == Q.rear)
{
cout<<"无队头元素"<<endl;
return ERROR;
}
p = Q.front->next;
e = p->data;
cout<<"队头元素为:"<<e<<endl;
return OK;
}
//队头出队
Status DeQueue_L(LinkQueue &Q)
{
QueuePtr p;
QElemType_L e;
if (Q.front == Q.rear)
{
cout<<"无队头元素"<<endl;
return ERROR;
}
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
cout << "队头元素"<<e<<"出队成功"<<endl;
return OK;
}
void show_help()
{
cout<<"******* Data Structure ******"<<endl;
cout<<"1----清空链队列"<<endl;//
cout<<"2----判断链队列是否为空"<<endl;//
cout<<"3----求链队列长度"<<endl;//
cout<<"4----显示链队列队头位置元素"<<endl;//
cout<<"5----队尾入队"<<endl;//
cout<<"6----队头出队"<<endl;//
cout<<"7----显示链队列"<<endl;//
cout<<" 退出,输入0"<<endl;
}
int main()
{
int operate_code;
show_help();
LinkQueue Q;
InitQueue_L(Q);
while(1)
{
cout<<"";
cin>>operate_code;
if(operate_code==1)
{
ClearQueue_L(Q);
}
else if (operate_code==2)
{
QueueEmpty_L(Q);
}
else if (operate_code==3)
{
cout<<"链队列的长度为:"<<QueueLength_L(Q)<<endl;
}
else if (operate_code==4)
{
GetHead_L(Q);
}
else if (operate_code==5)
{
EnQueue(Q);
}
else if (operate_code==6)
{
DeQueue_L(Q);
}
else if (operate_code==7)
{
QueueTraverse_L(Q);
}
else if (operate_code==0)
{
break;
}
else
{
cout<<"\n操作码错误!!!"<<endl;
show_help();
}
}
DestoryQueue(Q);
return 0;
}