// 2014年4月19日
// 链式队列的实现
// 用头结点来存储链表长度
//
// 存储格式
// 存储结构和单链表一样
// queue
// ↓
// [data][next] -> [data][next] -> [data][next] -> ... [data][0]
// head node node 0 node 1 end node
//
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
typedef int element_t;
typedef struct node_t
{
struct node_t *next;
element_t data;
} node_t, *linkqueue_t;
// 初始化一个空队列
void queue_init(linkqueue_t& queue)
{
queue = (linkqueue_t)malloc(sizeof(node_t));
queue->next = 0;
queue->data = 0;
}
// 清空队列
void queue_clear(linkqueue_t& queue)
{
node_t *p = queue->next;
while (p != 0)
{
node_t *q = p->next;
free(p);
p = q;
}
}
// 销毁队列
void queue_destroy(linkqueue_t& queue)
{
queue_clear(queue);
free(queue);
queue = 0;
}
// 判断是否为空
bool queue_is_empty(linkqueue_t& queue)
{
return 0 == queue->next;
}
// 获取队列的长度
int queue_length(linkqueue_t& queue)
{
return queue->data;
}
// 向队列放入一个元素
void queue_put(linkqueue_t& queue, element_t e)
{
node_t *p = queue;
while (p->next != 0) // 找到最后一个元素
{
p = p->next;
}
// 放入队列中去,放到最后一个元素的后面
node_t *q = (node_t *)malloc(sizeof(node_t));
q->data = e;
q->next = p->next;
p->next = q;
++queue->data; // 更新队列的长度
}
// 从队列里取出一个元素
bool queue_get(linkqueue_t& queue, element_t& e)
{
if (queue_is_empty(queue))
{
return false;
}
node_t *p = queue->next; // 取走第一个节点
e = p->data;
queue->next = p->next;
--queue->data; // 更新队列的长度
free(p);
return true;
}
// 输出队列元素的内容
void print(linkqueue_t& queue)
{
for (node_t *p = queue->next; p != 0; p = p->next)
{
printf("%02d ", p->data);
}
printf("\n");
}
int range(int a, int b)
{
return rand()%b + a;
}
int main()
{
int n = 10;
int size = 10;
srand((unsigned)time(0));
while (n--)
{
printf("n=%d\n", n);
linkqueue_t queue;
queue_init(queue);
int a = range(1, size);
while (a--)
{
int i = range(1, 10);
queue_put(queue, i);
print(queue);
}
int b = range(1, size);
while (b--)
{
element_t e;
if(!queue_get(queue, e))
{
if (queue_is_empty(queue))
{
break;
}
}
print(queue);
}
queue_destroy(queue);
}
return 0;
}
链式队列的表示和实现
最新推荐文章于 2021-05-19 00:53:32 发布