用链表写的一个队列
2017-04-13 11:21
225 查看
以下是最近用链表写的一个队列,包括创建,入队,出队,打印等功能
/**
* @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);
}
/**
* @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);
}
相关文章推荐
- 有一个单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。
- 用单链表实现一个队列或一个栈的出入队和出入栈操作
- 一个队列模块的接口 用链表
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 一个高性能无锁非阻塞链表队列
- 链表实现一个简单的队列
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- 实现一个链表和队列
- C++利用链表模板类实现一个简易队列
- 一个单向链表,并实现栈和队列
- C#基础之温习--使用列表和链表实现优一个先级队列
- 把一个新数插入到一个有序的单链表中
- 实现了一个完整的chain 链表
- 数据结构中关于链表的一个简单问题
- 面试系列7--用两个栈实现一个队列的功能
- 一个队列模块的接口
- 如何判断一个单向链表是否有环路?
- 一个包含小于a的质数的链表
- 一个简单的链表操作程序
- 一个链表小程序