以下是最近用链表写的一个队列,包括创建,入队,出队,打印等功能
/**
* @filename linkqueue.c
* @author haohaibo
* @data 2017/4/12
* @brief 用链表实现一个队列
**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int type_t;
typedef struct node{
type_t data;
struct node *Next;
}lqn_t;
typedef struct linkqueue_p{
lqn_t *front;
lqn_t *real;
int count;
}lq_t;
/**
* @brief 创建一个队列
*/
lq_t *linkqueue_creat()
{
lq_t *lq=(lq_t *)malloc(sizeof(lq_t));
lqn_t *n=(lqn_t *)malloc(sizeof(lqn_t));
if(NULL==lq)
{
printf(__FUNCTION__);
printf("error in line %d.\n",__LINE__);
return (lq_t*)-1;
}
n->data=0;
n->Next=NULL;
lq->front=n;
lq->real=n;
lq->count =0;
return lq;
}
/**
* @brief 入列
*/
int linkqueue_in(lq_t *lq,type_t value)
{
lqn_t *n=(lqn_t *)malloc(sizeof(lqn_t));
if(NULL==n)
{
printf(__FUNCTION__);
printf("error in line %d.\n",__LINE__);
return -1;
}
n->data=value;
n->Next=NULL;
lq->real->Next=n;
lq->real=n;
lq->count++;
return 0;
}
/**
* @brief 出列
*/
type_t linkqueue_out(lq_t *lq)
{
lqn_t *n;
type_t value;
if(lq->real==lq->front)
{
puts("error ");
exit(1);
}
n=lq->front->Next;
value=n->data;
lq->front->Next=n->Next;
if(lq->real==n)
lq->real=lq->front;
free(n);
n=NULL;
lq->count--;
return value;
}
/**
* @brief 全部元素出列
*/
int linkqueue_outall(lq_t *lq)
{
int i=lq->count;
if(lq->real==lq->front)
{
puts("error ");
exit(1);
}
while(i--)
linkqueue_out(lq);
}
/**
* @brief 打印队列元素
*/
int linkqueue_show(lq_t *lq)
{
lqn_t *p;
p=lq->front;
while(lq->front->Next!=NULL)
{
printf("%d ",lq->front->Next->data);
lq->front=lq->front->Next;
}
lq->front=p;
putchar(10);
return 0;
}
int main(void)
{
lq_t * lq1;
lq1=linkqueue_creat();
linkqueue_in(lq1,100);
linkqueue_in(lq1,200);
linkqueue_in(lq1,300);
linkqueue_in(lq1,400);
linkqueue_in(lq1,500);
linkqueue_show(lq1);
//printf("lq->count=%d.\n",lq1->count);
/*printf("out data is %d.\n",linkqueue_out(lq1));
printf("out data is %d.\n",linkqueue_out(lq1));
printf("out data is %d.\n",linkqueue_out(lq1));
printf("out data is %d.\n",linkqueue_out(lq1));
printf("out data is %d.\n",linkqueue_out(lq1));
printf("out data is %d.\n",linkqueue_out(lq1));*/
linkqueue_outall(lq1);
linkqueue_in(lq1,500);
linkqueue_show(lq1);
}