(九)队列的链式存储结构设计与实现

队列的链式存储结构设计与实现

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;
}

猜你喜欢

转载自blog.csdn.net/ailunlee/article/details/79929334