#include<iostream> using namespace std; typedef int ElemType; typedef struct QueueNode{ //结点结构 ElemType data; QueueNode *next; }QNode,*PNode; typedef struct FirstNode{ QueueNode *rear,*front; //队列就是一个队头结点后面跟一个链表, }*LkQueue; // front是头指针,而不是首元素节点 LkQueue IntiQueue(){ LkQueue Q; Q=new FirstNode; if(Q==NULL){ return Q; //空间分配失败返回NULL } PNode N=new QNode; if(N==NULL){ return NULL; } N->next==NULL; Q->rear=N; //头指针,尾指针指向同一个数据域为空结点 Q->front=N; //这个空结点相当于是链表表头 return Q; //返回队指针 } bool EnQueue(LkQueue Q,ElemType &x){ if(Q==NULL){ //队列无效 return false; } PNode Cell; Cell=new QNode; //为入队的数据分配空间 if(Cell==NULL){ //空间分配失败 return false; } Cell->data=x; Cell->next=NULL; //队尾入队 Q->rear->next=Cell; Q->rear=Cell; return true; } bool DeQueue(LkQueue Q,ElemType &x){ if(Q==NULL||Q->front==Q->rear){ //队无效或空队 return false; } PNode temp=Q->front; //temp是头指针 x=temp->next->data; Q->front=temp->next; //队头出队 delete temp; //释放结点空间 return true; } bool FrontQueue(LkQueue Q,ElemType &x){ if(Q==NULL||Q->front==Q->rear){ //队无效或空队 return false; } x=Q->front->next->data; //访问首元素 return true; } bool PrintQueue(LkQueue Q){ if(Q==NULL||Q->front==Q->rear){ //队无效或空队 return false; } ElemType x; PNode index=Q->front; //index是头指针的副本,改变的是副本,原队列不改变 while(index!=Q->rear){ x=index->next->data; cout<<x<<" "; index=index->next; //遍历队列 } return true; } //菜单函数 void Meue(){ cout<<" 队列子系统"<<endl; cout<<"----------------------------------------"<<endl; cout<<"| 1-初始化队列 |"<<endl; cout<<"| 2-入队操作 |"<<endl; cout<<"| 3-出队操作 |"<<endl; cout<<"| 4-求队头元素 |"<<endl; cout<<"| 5-显示队中所有的元素 |"<<endl; cout<<"| 0-返回 |"<<endl; cout<<"----------------------------------------"<<endl; cout<<" 请输入菜单号:"; } int main(){ Meue(); LkQueue Q; ElemType x; //x为操作元素 int m; //m为菜单号 cin>>m; while(m){ switch(m){ case 1:Q=IntiQueue();cout<<"完成初始化。"<<endl<<endl;break; case 2:cout<<"请输入待插入元素:"; cin>>x; EnQueue(Q,x); cout<<"插入完成"<<endl<<endl; break; case 3:if(DeQueue(Q,x)){ cout<<"队空,无法操作。"<<endl<<endl; } else{ cout<<"元素"<<x<<"已出队。"<<endl<<endl; } break; case 4:if(!FrontQueue(Q,x)){ cout<<"队空,无法操作。"<<endl<<endl; } else{ cout<<"队头元素为:"<<x<<endl<<endl; } break; case 5:cout<<"队中所有的元素:"; PrintQueue(Q); cout<<endl<<endl;break; default:break; } Meue(); cin>>m; } return 0; }