#include <iostream>
#include <cstring>
using namespace std;
typedef struct node{
int age;
string name;
struct node * next;
}student;
typedef struct node2{
int size;
student * front;
student * tail;
}queue;
//初始化队列
queue* InitQueue(){
queue * myqueue=new queue;
myqueue->size=0;
myqueue->front=NULL;
myqueue->tail=NULL;
return myqueue;
}
//入队 从队尾入
void pushQueue(queue * myqueue,int age,string name){
student * p=new student;
p->age=age;
p->name=name;
p->next=NULL;
if(myqueue->size==0){
//说明当前队列为空,新元素入队后时队里的第一个结点
//此时队头队尾都是同一个人,也就是都是新结点的地址
myqueue->front=p;
myqueue->tail=p;
}
else{
//不是第一个结点
myqueue->tail->next=p;
//原来的队尾元素的next区域里面放新结点的地址
myqueue->tail=p;
//然后把队尾元素变成新结点
}
myqueue->size++;//只要入队了,队里的元素就会增加
}
//出队操作
void popQueue(queue* myqueue){
if (myqueue->size==0){
cout<<"当前队列为空,无法执行出队操作"<<endl;
}
else{
//先把要出队的队头元素地址保存起来
//然后新的队头地址是在当前这个队头元素的next区域里的
student * q=myqueue->front;
myqueue->front=q->next;
delete q;
myqueue->size--;
}
}
void printQueue(queue * myqueue){
if(myqueue->size==0){
cout<<"当前队列为空,无法遍历"<<endl;
}
else{
cout<<"----------------------------"<<endl;
cout<<"开始遍历队列"<<"队头元素地址为"<<myqueue->front<<endl;
cout<<"队尾元素地址为"<<myqueue->tail<<endl;
student * curNode=myqueue->front;
//不能用队头指针和队尾指针去遍历,所以自己建一个指针用来遍历
while(curNode!=NULL){
cout<<curNode->age<<curNode->name<<"结点地址为"<<curNode<<endl;
curNode=curNode->next;
}
cout<<"结束遍历队列"<<"队头元素地址为"<<myqueue->front<<endl;
cout<<"队尾元素地址为"<<myqueue->tail<<endl;
}
}
int main(){
queue* myqueue=InitQueue();
pushQueue(myqueue,1,"AAAAA");
pushQueue(myqueue,2,"BBBBB");
pushQueue(myqueue,3,"CCCCC");
pushQueue(myqueue,4,"DDDDD");
pushQueue(myqueue,5,"EEEEE");
printQueue(myqueue);
popQueue(myqueue);
printQueue(myqueue);
}