您的位置:首页 > 理论基础 > 数据结构算法

数据结构封装之《LinkQueue链式队列》

2017-08-29 13:43 155 查看

说明:

本队列是通过链表实现的;

这里采用了代码复用的方法,即使用了LinkList线性链表,详见 《LinkList单向链表》

下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析

代码:

LinkQueue.h

#ifndef _LINKQUEUE_H_
#define _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);

void* LinkQueue_Header(LinkQueue* queue);

int LinkQueue_Length(LinkQueue* queue);

#endif


LinkQueue.c

#include <malloc.h>
#include "LinkList.h"
#include "LinkQueue.h"

typedef struct _tag_LinkQueueNode
{
LinkListNode header
4000
;
void* item;
} TLinkQueueNode;

//生成队列
LinkQueue* LinkQueue_Create() // O(1)
{
return LinkList_Create();
}
//销毁队列
void LinkQueue_Destroy(LinkQueue* queue) // O(n)
{
LinkQueue_Clear(queue);
LinkList_Destroy(queue);
}
//清空队列
void LinkQueue_Clear(LinkQueue* queue) // O(n)
{
while( LinkQueue_Length(queue) > 0 )
{
LinkQueue_Retrieve(queue);
}
}
//入队
int LinkQueue_Append(LinkQueue* queue, void* item) // O(n)
{
TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
int ret = (item != NULL) && (node != NULL);

if( ret )
{
node->item = item;

ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));
}

if( !ret )
{
free(node);
}

return ret;
}
//出队
void* LinkQueue_Retrieve(LinkQueue* queue) // O(1)
{
TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);
void* ret = NULL;

if( node != NULL )
{
ret = node->item;

free(node);
}

return ret;
}
//队列头部数据(不出队)
void* LinkQueue_Header(LinkQueue* queue) // O(1)
{
TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);
void* ret = NULL;

if( node != NULL )
{
ret = node->item;
}

return ret;
}
//队列长度
int LinkQueue_Length(LinkQueue* queue) // O(1)
{
return LinkList_Length(queue);
}


main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkQueue.h"

int main(int argc, char *argv[])
{
LinkQueue* queue = LinkQueue_Create();
int a[10] = {0};
int i = 0;

for(i=0; i<10; i++)
{
a[i] = i + 1;

LinkQueue_Append(queue, a + i);
}

printf("Header: %d\n", *(int*)LinkQueue_Header(queue));
printf("Length: %d\n", LinkQueue_Length(queue));

while( LinkQueue_Length(queue) > 0 )
{
printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue));
}

LinkQueue_Destroy(queue);

return 0;
}


函数结构分析:

1.LinkQueue_Create



2.LinkQueue_Retrieve



3.LinkQueue_Clear



4.LinkQueue_Header



5.LinkQueue_Append



汇编分析:

main



1.LinkQueue_Create



2.LinkQueue_Append



3.LinkQueue_Header



4.LinkQueue_Length



5.LinkQueue_Retrieve



6.LinkQueue_Destroy

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: