队列的链式存储结构设计与实现
1、概念
队列也是一种特殊的线性表;可以用线性表的链式存储来模拟队列的链式存储。
2、实现
(1)linkqueue.h
#ifndef _MY_LINKQUEUE_H_
#define _MY_LINKQUEUE_H_
typedef void LinkQueue;
LinkQueue* LinkQueue_Create();
void LinkQueue_Destory(LinkQueue* queue);
void LinkQueue_Clear(LinkQueue* queue);
int LinkQueue_Append(LinkQueue* queue, void* item);
void* LinkQueue_Retrieve(LinkQueue* queue);
void* LinkQueue_Header(LinkQueue* queue);
int LinkQueue_Length(LinkQueue* queue);
#endif
(2)linkqueue.c(linklist.h链接)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "linkqueue.h"
#include "linklist.h"
//队列是特殊的线性表
//队列的业务结点的数据结构
typedef struct _tag_LinkQueueNode
{
LinkListNode node;
void* item;
}TLinkQueueNode;
//创建链式存储的队列 相当于 创建链式存储的线性表
LinkQueue* LinkQueue_Create()
{
return LinkList_Create();
}
//销毁队列 相当于 销毁线性表
//涉及结点的内存管理
void LinkQueue_Destory(LinkQueue* queue)
{
LinkQueue_Clear(queue);
LinkList_Destory(queue);
}
//清空队列 相当于 清空线性表
//涉及结点的内存管理,需要释放每一个结点
void LinkQueue_Clear(LinkQueue* queue)
{
while (LinkQueue_Length(queue) > 0)
{
LinkQueue_Retrieve(queue);
}
LinkList_Clear(queue);
}
//向队列中添加元素 相当于 向线性表尾部添加元素
int LinkQueue_Append(LinkQueue* queue, void* item)
{
int ret = 0;
TLinkQueueNode *tmp = NULL;
tmp = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));
if (tmp == NULL)
{
ret = -1;
printf("func LinkQueue_Append() malloc() err:%d\n", ret);
return ret;
}
memset(tmp, 0, sizeof(TLinkQueueNode));
tmp->item = item;
//需要把栈的item(栈的业务结点) 转化成 链表的业务结点LinkListNode
ret = LinkList_Insert(queue, (LinkListNode*)tmp, LinkList_Length(queue));
if (ret != 0)
{
printf("func LinkList_Insert() err:%d\n", ret);
if (tmp != NULL)
{
free(tmp);
}
return ret;
}
return ret;
}
//从队列中删除元素 相当于 从线性表的头部删除元素
void* LinkQueue_Retrieve(LinkQueue* queue)
{
TLinkQueueNode *tmp = NULL;
void *ret = NULL;//队列的业务结点
tmp = (TLinkQueueNode *)LinkList_Delete(queue, 0);
if (tmp == NULL)
{
printf("func LinkQueue_Retrieve() LinkList_Delete() err!\n");
return NULL;
}
//删除之前先缓存
ret = tmp->item;
if (ret != NULL)
{
free(tmp);
}
return ret;
}
//获取队列头部元素 相当于 从线性表的0号位置拿数据
void* LinkQueue_Header(LinkQueue* queue)
{
TLinkQueueNode *tmp = NULL;
tmp = (TLinkQueueNode *)LinkList_Get(queue, 0);
if (tmp == NULL)
{
printf("func LinkQueue_Header() LinkList_Get() err!");
return NULL;
}
return tmp->item;
}
//求队列的长度 相当于 求线性表的长度
int LinkQueue_Length(LinkQueue* queue)
{
return LinkList_Length(queue);
}
(3)具体实现
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "linkqueue.h"
void maindm009()
{
int ret = 0;
int a[10];
//创建队列
LinkQueue* queue = NULL;
queue = LinkQueue_Create();
if (queue == NULL)
{
ret = -1;
printf("func LinkQueue_Create() err:%d\n", ret);
return ;
}
//插入元素
printf("The Queue is: ");
for (int i = 0; i < 5; i++)
{
a[i] = i + 1;
ret = LinkQueue_Append(queue, &a[i]);
printf("%d ", ret);
}
printf("\n");
//打印队列长度
printf("The Queue's Length:%d\n", LinkQueue_Length(queue));
//打印队列对头元素
printf("The Queue's Header:%d\n", *((int*)LinkQueue_Header(queue)));
//出队列
while (LinkQueue_Length(queue) > 0)
{
int tmp = *((int *)LinkQueue_Retrieve(queue));
printf("tmp:%d ", tmp);
}
printf("\n");
//销毁队列
LinkQueue_Destory(queue);
system("pause");
return;
}