• 队列的优化链式实现


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

    /* run this program using the console pauser or add your own getch, system("pause") or input loop */

    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 ", *(int*)LinkQueue_Header(queue));
        printf("Length: %d ", LinkQueue_Length(queue));
        
        LinkQueue_Clear(queue);
        
        while( LinkQueue_Length(queue) > 0 )
        {
            printf("Retrieve: %d ", *(int*)LinkQueue_Retrieve(queue));
        }
        
        LinkQueue_Destroy(queue);
        
        return 0;
    }

    2.#include <malloc.h>
    #include <stdio.h>
    #include "LinkQueue.h"
    /* link queue*/
    typedef struct _tag_LinkQueueNode TLinkQueueNode;
    struct _tag_LinkQueueNode
    {
        TLinkQueueNode* next;
        void* item;
    };

    typedef struct _tag_LinkQueue
    {
        TLinkQueueNode* front;
        TLinkQueueNode* rear;
        int length;
    } TLinkQueue;

    LinkQueue* LinkQueue_Create() // O(1)
    {
        TLinkQueue* ret = (TLinkQueue*)malloc(sizeof(TLinkQueue));
        
        if( ret != NULL )
        {
            ret->front = NULL;
            ret->rear = NULL;
            ret->length = 0;
        }
        
        return ret;
    }

    void LinkQueue_Destroy(LinkQueue* queue) // O(n)
    {
        LinkQueue_Clear(queue);
        free(queue);
    }

    void LinkQueue_Clear(LinkQueue* queue) // O(n)
    {
        while( LinkQueue_Length(queue) > 0 )
        {
            LinkQueue_Retrieve(queue);
        }
    }

    int LinkQueue_Append(LinkQueue* queue, void* item) // O(1)
    {
        TLinkQueue* sQueue = (TLinkQueue*)queue;
        TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
        int ret = (sQueue != NULL ) && (item != NULL) && (node != NULL);
        
        if( ret )
        {
            node->item = item;
            
            if( sQueue->length > 0 )
            {
            //入队列
                sQueue->rear->next = node;
                sQueue->rear = node;
                node->next = NULL;
            }
            else
            {
            //插入到头部
                sQueue->front = node;
                sQueue->rear = node;
                node->next = NULL;
            }
            
            sQueue->length++;
        }
        
        if( !ret )
        {
            free(node);
        }
        
        return ret;
    }

    void* LinkQueue_Retrieve(LinkQueue* queue) // O(1)
    {
        TLinkQueue* sQueue = (TLinkQueue*)queue;
        TLinkQueueNode* node = NULL;
        void* ret = NULL;
        
        if( (sQueue != NULL) && (sQueue->length > 0) )
        {
            node = sQueue->front;
            
            sQueue->front = node->next;
            
            ret = node->item;
            
            free(node);
            
            sQueue->length--;
            
            if( sQueue->length == 0 )
            {
                sQueue->front = NULL;
                sQueue->rear = NULL;
            }
        }
        
        return ret;
    }

    void* LinkQueue_Header(LinkQueue* queue) // O(1)
    {
        TLinkQueue* sQueue = (TLinkQueue*)queue;
        void* ret = NULL;
        
        if( (sQueue != NULL) && (sQueue->length > 0) )
        {
            ret = sQueue->front->item;
        }
        
        return ret;
    }

    int LinkQueue_Length(LinkQueue* queue) // O(1)
    {
        TLinkQueue* sQueue = (TLinkQueue*)queue;
        int ret = -1;
        
        if( sQueue != NULL )
        {
            ret = sQueue->length;
        }
        
        return ret;
    }

    3.#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

  • 相关阅读:
    两种解决IE6不支持固定定位的方法
    DIV+CSS IE6/IE7/IE8/FF兼容问题汇总
    解决IE6兼容性问题的十一大技巧
    解决 IE6 背景缓存
    C#用正则表达式 获取网页源代码标签的属性或值
    js中addEventListener中第3个参数
    jquery ready方法实现原理 内部原理
    jQuery动画animate方法使用介绍
    GetParam(name)
    js未分类
  • 原文地址:https://www.cnblogs.com/wxb20/p/6144890.html
Copyright © 2020-2023  润新知