typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr; //队列的结点的申请,并且明确其类型!
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int LnitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); //分配空节点,创建空队列
Q.front->next=NULL; //头结点next指针为空
return 0;
};
int EnQueue(LinkQueue &Q,int e){ //加入队列,结点值为e
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode)); //分配结点空间
p->data=e; //数据赋值
p->next=NULL;
Q.rear->next=p; //在尾部插入
Q.rear=p; //尾部指针指向尾部,所谓的头指针和尾指针都只是指针,只不过指针指向特殊申明的结点,不要把它看成
return 0; //队列的一部分,意想成为也是头结点,其实不是这样的!
};
int DeQueue(LinkQueue &Q,int &e){ //Q.front or Q.rear仅仅是指针而已,不是什么结点!!!,但队列中还是有头结点概念!
//在创建空队列的时候就决定了一定会有头结点,并且新加入元素在队伍尾进行!
if(Q.front==Q.rear) cout<<"The Queue is wrong!"<<endl;
QueuePtr p;
p=Q.front->next; //p指向第一个结点
e=p->data; //e复制数据
Q.front->next=p->next; // 队头指针下移一位
if(Q.rear==p) Q.rear=Q.front; //如果队列为空了,则队头等于对尾,这是常常忽略的,此时还是有空的头结点的!
delete(p);
return 0;
};
int QueueEmpty(LinkQueue Q){
if(Q.front==Q.rear)return 1; //判断是否为空,空为1,不空为0
else return 0;
};