图解队列的链式存储

 

 

 

#ifndef _KN_LINKQUEUE_H_
#define _KN_LINKQUEUE_H_

typedef void LinkQueue;

//创建链式队列
LinkQueue* LinkQueue_Create();

//销毁链式队列
void LinkQueue_Destroy(LinkQueue* queue);

//清空链式队列
void LinkQueue_Clear(LinkQueue* queue);

//向链式队列队尾添加一个元素
int LinkQueue_Append(LinkQueue* queue, void* item);

//从链式队列队头取出元素(删除)
void* LinkQueue_Retrieve(LinkQueue* queue);

//获取链式队列 队头(0号元素)
void* LinkQueue_Header(LinkQueue* queue);

//获取链式队列长度
int LinkQueue_Length(LinkQueue* queue);

#endif //_KN_LINKQUEUE_H_

 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "knLinklist.h"
#include "knLinkqueue.h"

//使用单向链表模拟链式队列
typedef struct _tag_LinkQueueNode
{
	LinkListNode node;
	void *item;			//业务节点
}TLinkQueueNode;

//创建链式队列
LinkQueue* LinkQueue_Create()
{
	return LinkList_Create();
}

//销毁链式队列
void LinkQueue_Destroy(LinkQueue* queue)
{
	LinkQueue_Clear(queue);
	LinkList_Destroy(queue);
	return;
}

//清空链式队列
void LinkQueue_Clear(LinkQueue* queue)
{
	while (LinkList_Length(queue) > 0){
		LinkQueue_Retrieve(queue);//从队头删除
	}
	return;
}

//向链式队列队尾添加一个元素 相当于向链表的尾部插入元素
int LinkQueue_Append(LinkQueue* queue, void* item)
{
	int ret = 0;
	TLinkQueueNode *node = NULL;
	//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
	//需要让链表结点放在业务节点的第一个成员域

	//把形参item,转换为 linklist识别的业务节点   链队列的每次申请和释放空间会存在时间开销的
	node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
	if (node == NULL){
		return -1;
	}
	memset(node, 0, sizeof(TLinkQueueNode));
	node->item = item;

	ret = LinkList_Insert(queue, (LinkListNode *)node, LinkList_Length(queue));
	if (ret != 0){
		free(node);
		return ret;
	}
	return ret;
}

//从链式队列队头取出元素(删除)
void* LinkQueue_Retrieve(LinkQueue* queue)
{
	int ret = 0;
	void *item = NULL;
	TLinkQueueNode *node = NULL;
	node = (TLinkQueueNode*)LinkList_Delete(queue, 0);
	if (node == NULL){
		return NULL;
	}

	item = node->item;
	if (node != NULL){//注意内存释放
		free(node);
		node = NULL;
	}
	return item;
}

//获取链式队列 队头(0号元素)
void* LinkQueue_Header(LinkQueue* queue)
{
	int ret = 0;
	void *item = NULL;
	TLinkQueueNode *node = NULL;
	node = (TLinkQueueNode*)LinkList_Get(queue, 0);
	if (node == NULL){
		return NULL;
	}
	item = node->item;
	return item;
}

//获取链式队列长度
int LinkQueue_Length(LinkQueue* queue)
{
	return LinkList_Length(queue);
}

 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "knLinkqueue.h"

void test()
{
	int i, a[10];
	LinkQueue *queue = NULL;
	queue = LinkQueue_Create();

	for (i = 0; i < 10; i++){
		a[i] = i + 1;
		printf("向队尾插入数据:%d\n", a[i]);
		LinkQueue_Append(queue, &a[i]);
	}

	printf("the length of queue:%d\n", LinkQueue_Length(queue));
	printf("the header of queue:%d\n", *((int*)LinkQueue_Header(queue)));
	while (LinkQueue_Length(queue) > 0){
		printf("从队头取出数据: %d\n", *((int*)LinkQueue_Retrieve(queue)));
	}
	LinkQueue_Destroy(queue);
}
int main()
{
	test();
	system("pause");
	return 0;
}

 

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页