以下是最近用链表写的一个队列,包括创建,入队,出队,打印等功能
/** * @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); }