图解队列的链式存储

 

 

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值