在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作实现过程
入队过程如下图:
先创一个结点,用于存储要插入的结点数据
然后就是老套路了:先连后断
void EnQueue(LinkQueue* Q,int x){
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
//malloc申请一个QNode结点大小的空间,然后用指针s指向它
s->data=x;//把x值赋到结点里面
if(Q->rear==NULL){//队列为空,新加入的s结点成为唯一结点
Q->rear=s;
Q->rear->rear=Q->rear;//唯一一个结点就自己指向自己形成一个环
}
else{
s->next=Q->rear->next;//先连:s的next指向rear的next(也就是头结点)
Q->rear->next=s;//后断,当前rear的next指向s
Q->rear=s;//s成为新的rear
}
}
出队过程如下图:
void DeQueue(LinkQueue* Q){
QueuePtr p;
if(Q->rear==NULL){//空队列,没办法出队
printf("队列为空,无法出队");
return;
}
if(Q->rear->next==Q->rear){//队列中只有一个元素
p=Q->rear;//用p记录rear位置,再free掉
free(p);
Q->rear=NULL;//最后rear置空
}
else{//队列还有一些元素
p=Q->rear->next;//通过rear找到头结点赋给p
Q->rear->next=p->next;//rear连上头结点下一个结点
free(p);//把p释放掉
}
}