#include<stdio.h>
#include<stdlib.h>
//队列节点结构体
typedef struct node
{
//数据域
int data;
//指针域
struct node *next;
}*Queue_node;
//队列管理结构
typedef struct queue
{
int size;
struct node *queue_head;
struct node *queue_tail;
}*Queue;
//初始化队列
Queue Init_Queue()
{
//申请队列管理结构体内存
Queue q_list=(Queue)malloc(sizeof(struct queue));
if(!q_list)
{
return NULL;
}
q_list->size=0;
q_list->queue_head=NULL;
q_list->queue_tail=NULL;
return q_list;
}
//判断队列是否为空
int Queue_is_empty(Queue q_list)
{
if(q_list)
{
return q_list->size==0;
//如果size为0,返回真,否则返回假('=='为 逻辑等 )
}
}
//入队,新节点接到队列后(队列先入先出)
int Queue_enqueue(Queue q_list,int data)
{
if(!q_list)
{
return -1;
}
//新建节点
Queue_node new_node=(Queue_node)malloc(sizeof(struct node));
if(!new_node)
{
return -1;
}
new_node->data=data;
new_node->next=NULL;
//情况1:队伍中没有数据,所以队头和队尾都指向新节点
if( Queue_is_empty( q_list))
{
q_list->queue_head=new_node;
q_list->queue_tail=new_node;
}
else
{
q_list->queue_tail->next=new_node;
q_list->queue_tail=new_node;
}
q_list->size++;//数据加1
return 0;
}
//出队,队头的节点先出
int Queue_dequeue(Queue q_list)
{
int data;
if(!q_list)
{
return -1;
}
Queue_node p=q_list->queue_head;//借助指针指向需要出队的节点
//情况1:队伍为空
if(Queue_is_empty(q_list))
{
return -1;
}
else if(q_list->size==1)//队列中有1人
{
q_list->queue_head=NULL;
q_list->queue_tail=NULL;
p->next=NULL;
data=p->data;
free(p);
p=NULL;
q_list->size--;
}
else//队列中有两个以上的人
{
q_list->queue_head=q_list->queue_head->next;
p->next=NULL;
data=p->data;
free(p);
p=NULL;
q_list->size--;
}
return data;
}
//销毁队列
int Queue_destroy(Queue *q_list)
{
if(!q_list)
{
return -1;
}
for(int i=0;i<(*q_list)->size;i++)
{
Queue_dequeue(*q_list);
}
free(*q_list);
q_list=NULL;
return 0;
}
int main()
{
Queue q_list=Init_Queue();
Queue_enqueue(q_list,10);
Queue_enqueue(q_list,20);
Queue_enqueue(q_list,30);
Queue_enqueue(q_list,40);
Queue_enqueue(q_list,50);
printf("data=%d\t",Queue_dequeue(q_list));
printf("data=%d\t",Queue_dequeue(q_list));
printf("data=%d\t",Queue_dequeue(q_list));
printf("data=%d\t",Queue_dequeue(q_list));
printf("data=%d\t",Queue_dequeue(q_list));
printf("\n");
Queue_destroy(&q_list);
return 0;
}