// 带头节点的链式存储队列
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node * next;
}QNode;
typedef struct queue{
QNode *front;
QNode *rear;
}Queue;
void initQueue(Queue *Q){
Q->front=Q->rear=(QNode *)malloc(sizeof(QNode));
Q->front->next=NULL;
}
int isEmpty(Queue * Q){
return Q->rear == Q->front;
}
// 入队使用尾插法好一些,出队front+1,入队rear+1,和书上保持一致
int enQueue(Queue * Q,int e){
QNode * p = (QNode *)malloc(sizeof(QNode));
if(p==NULL) return 0; // 分配失败
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p; // 入队更新rear,指向新节点
return 1;
}
int deQueue(Queue * Q,int *e){
QNode *p;
if(isEmpty(Q)){
puts("Empty!");
return 0;
}
p=Q->front->next;
*e=p->data;
Q->front->next=p->next; // 注意这里,带头节点
if(Q->rear==p) Q->rear=Q->front; // 如果要被释放的p节点是除头节点的唯一节点
free(p);
return 1; //直接返回,取地址的话会出现问题
}
void Traverse(Queue *Q){
QNode *p;
p=Q->front->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
// 连同头节点也被销毁掉了
void destroyQueue(Queue *Q){
while(Q->front!=NULL){
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
printf("Destroyed!\n");
}
int main(){
Queue Q;
initQueue(&Q);
int i,e;
for(i=1; i<=10; i++){
enQueue(&Q,i);
}
deQueue(&Q,&e);
printf("DQ:%d \n",e);
deQueue(&Q,&e);
printf("DQ:%d \n",e);
deQueue(&Q,&e);
printf("DQ:%d \n",e);
Traverse(&Q);
destroyQueue(&Q);
return 0;
}
3.2 队列-链式存储
最新推荐文章于 2022-09-18 13:45:57 发布