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

来源:互联网 发布:apache 安装版下载 编辑:程序博客网 时间:2024/06/05 16:03

说明:

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

  2. 这里采用了代码复用的方法,即使用了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;    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

原创粉丝点击