#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct item{
int data;
} Item;
//节点结构
typedef struct node{
Item item;
struct node *nextNode;
}Node, *queue;
//队列的链表结构
typedef struct {
queue front;
queue rear;
} linkQueue;
//初始化
void initQueue(linkQueue *q);
//入队
void enQueue(linkQueue *q, Node *n);
//出队
void DeQueue(linkQueue *q);
//取得队头元素
void GetHead(linkQueue *q, Node *n);
//取得队列长队
int QueueLength(linkQueue *q);
//置空队列
void ClearQueue(linkQueue *q);
//销毁队列
void DestroyQueue(linkQueue *q);
void initQueue(linkQueue *q){
Node *node = (Node *)malloc( sizeof(Node) );
if(!node){
fprintf(stderr, "初始化错误.");
exit(EXIT_FAILURE);
}
node->nextNode = NULL;
q->front = node;
q->rear = node;
}
void enQueue(linkQueue *q, Item *e){
//创建插入元素
Node *n = (Node *)malloc( sizeof(Node) );
if(!n){
fprintf(stderr, "入队失败.");
exit(EXIT_FAILURE);
}
n->item = *e;
n->nextNode = NULL;
//把新节点赋给队尾元素的后继
q->rear->nextNode = n;
//把新节点赋给 队尾指针
q->rear = n;
}
void DeQueue(linkQueue *q, Item *e){
//判断队列是否为空
if(q->front == q->rear){
fprintf(stderr, "出对错误,队列为空");
exit(EXIT_FAILURE);
}
//保存出队元素
Node *outNode = q->front->nextNode;
//重新赋值头指针的nextnode
q->front->nextNode = outNode->nextNode;
//保存出队节点
*e = outNode->item;
//判断出队后的队头是否等于队尾
if(q->rear == outNode){
q->front = q->rear;
}
//释放队头指针
free(outNode);
}
void GetHead(linkQueue *q, Item *e){
if(q->front == q->rear){
fprintf(stderr, "取头指针错误,队列为空");
exit(EXIT_FAILURE);
}
Node *node = q->front->nextNode;
*e = node->item;
}
int QueueLength(linkQueue *q){
int i = 0;
Node *node = q->front;
while(node != q->rear){
node = node->nextNode;
i++;
}
return i;
}
void ClearQueue(linkQueue *q){
q->rear = q->front;
Node *node = q->rear->nextNode;
q->rear->nextNode = NULL;
Node *n ;
while(node){
n = node;
node = node->nextNode;
free(n);
}
}
void DestroyQueue(linkQueue *q){
while(q->front){
q->rear= q->front->nextNode;
free(q->front);
q->front = q->rear;
}
}
int main(void){
linkQueue q;
initQueue(&q);
Item e = {
e.data = 1
};
Item e1 = {
e1.data = 2
};
Item e2 = {
e2.data = 3
};
Item e3 = {
e3.data = 4
};
enQueue(&q,&e);
enQueue(&q,&e1);
enQueue(&q,&e2);
enQueue(&q,&e3);
printf("队列长度:%d.\n", QueueLength(&q));
Item e4;
GetHead(&q,&e4);
printf("取队头元素:%d.\n",e4.data);
Item e5;
DeQueue(&q, &e5);
printf("出队元素:%d.\n", e5.data);
ClearQueue(&q);
Item e6;
DeQueue(&q, &e6);
printf("出队元素:%d.\n", e6.data);
DestroyQueue(&q);
return 0;
}