#include <stdio.h>
#include <stdlib.h>
enum return_val{EMPTY_OK,EMPTY_NO,ENTER_OK,ENTER_NO,DELETE_OK,DELETE_NO,GET_OK,GET_NO};
struct queue_data
{
int num;
struct queue_data *next;
};
typedef struct queue_data QueueNode;//队链各结点
typedef struct
{
QueueNode *rear;//允许入队的一端
QueueNode *front;//允许出队的一端
}LinkQueue;
void initqueue(LinkQueue *Q)
{
Q->front=Q->rear=NULL;
}
int is_malloc_ok(QueueNode *node)
{
if(node == NULL)
{
return 0;
}
else
{
return 1;
}
}
int create_node(QueueNode **node)
{
*node=(QueueNode*)malloc(sizeof(QueueNode));
is_malloc_ok(*node);
}
int is_empty_linkqueue(LinkQueue *Q)
{
if(Q->front == NULL)
{
return EMPTY_OK;
}
else
{
return EMPTY_NO;
}
}
int enterqueue(LinkQueue *Q,int num)
{
QueueNode *p;
if(create_node(&p)==0)
{
printf("malloc error!\n");
return ENTER_NO;
}//先判断创建队链结点是否成功
else
{
p->num=num;
p->next=NULL;//队链的结点值域为num;
if(Q->front == NULL)
{
Q->rear=Q->front=p;
}//判断是不是第一个要入队的结点,如果是则队列的两端均为p
else
{
Q->rear=Q->rear->next=p;
}//若不是先将rear+1,并把p放于rear
return ENTER_OK;
}
}
int getfront(LinkQueue *Q,int *num)
{
if(is_empty_linkqueue(Q)==EMPTY_OK)
{
return GET_NO;
}
else
{
*num=Q->front->num;
Q->front=Q->front->next;
return GET_OK;
}
}//读取front端的结点
int delqueue(LinkQueue *Q,int *num)
{
QueueNode *p;
if(is_empty_linkqueue(Q)==EMPTY_OK)
{
return DELETE_NO;
}
else
{
p=Q->front;
*num=Q->front->num;
Q->front=Q->front->next;
//将front+1后取出p
if(Q->front == NULL)
{
Q->rear==NULL;
}//判断是不是最后一个要出队列的结点
free(p);
return DELETE_OK;
}
}
//从front端读取结点先判断队列是否为空;
int releasequeue(LinkQueue *Q)
{
QueueNode *p;
while(Q->front != NULL)
{
p=Q->front;
Q->front=Q->front->next;
free(p);
return -1;
}
if(Q->front == NULL)
{
return 0;
}
}
int main()
{
LinkQueue Q;
int i;
int num;
initqueue(&Q);
for(i=0;i<5;i++)
{
if(enterqueue(&Q,i+1)==ENTER_NO)
{
printf("enter no!\n");
}
else
{
printf("enter_ok,num=%d\n",i+1);
}
}
for(i=0;i<3;i++)
{
if(getfront(&Q,&num)==GET_NO)
{
printf("get no!\n");
}
else
{
printf("get ok!,num=%d\n",num);
}
}
for(i=0;i<5;i++)
{
if(delqueue(&Q,&num)==DELETE_NO)
{
printf("delete no!\n");
}
else
{
printf("delete ok!num=%d\n",num);
}
}
releasequeue(&Q);
return 0;
}