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