频道栏目
首页 > 资讯 > C语言 > 正文

队列链性表c语言实现方式 linkqueue.h 和 linkqueue.c

17-07-11        来源:[db:作者]  
收藏   我要投稿

linkqueue.h 文件

#ifndef _LINK_QUEUE_H_
#define _LINK_QUEUE_H_
#include 
#include 
#include 

typedef void Queue;

typedef struct _tag_LinkQueueNode
{
    LinkListConnectedNode connected_node;
    void* item;
}LinkQueueNode;

#ifndef bool
#define bool int
#define true 1
#define false 0
#endif

Queue* LinkQueue_Create();
bool LinkQueue_Destory(Queue* queue);
bool LinkQueue_Clear(Queue* queue);
bool LinkQueue_Append(Queue* queue, void* item);
void* LinkQueue_Retrieve(Queue* queue);
void* LinkQueue_Header(Queue* queue);
int LinkQueue_GetLength(Queue* queue);

#endif

linkqueue.c 文件

#include 
#include 
#include 
#include "linklist.h"
#include "linkqueue.h"

//队列的链式存储

//队列元素出队列时,注意内存管理

//创建队列相当于创建链式线性表
Queue* LinkQueue_Create()
{
    return LinkList_Create();
}

//销毁队列相当于先清空队列,在销毁链表
bool LinkQueue_Destory(Queue* queue)
{
    bool ret;
    ret = LinkQueue_Clear(queue);
    if (ret == false)
    {
        return false;
    }
    ret = LinkList_Destory(queue);
    if (ret == false)
    {
        return false;
    }
    return true;
}
//清空队列相当于所有元素出队列,在清空链表
bool LinkQueue_Clear(Queue* queue)
{
    bool ret;
    while(LinkQueue_GetLength(queue) > 0)
    {
        LinkQueue_Retrieve(queue);
    }
    ret = LinkList_Clear(queue);
    if (ret == false)
    {
        return false;
    }
    return true;
}

//队列添加元素相当于在链表尾部插入元素
//队列业务节点转换为链表节点
bool LinkQueue_Append(Queue* queue, void* item)
{
    bool ret;
    LinkQueueNode* linkqueuenode = NULL;
    linkqueuenode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    if (linkqueuenode == NULL)
    {
        return false;
    }
    memset(linkqueuenode,0,sizeof(LinkQueueNode));  //初始化
    //linkqueuenode->connected_node.next = NULL;
    linkqueuenode->item = item;
    ret = LinkList_InsertOneNode(queue,(ListNode*)linkqueuenode,LinkList_GetLength(queue));
    if (ret == false)
    {
        if (linkqueuenode != NULL)
        {
            free(linkqueuenode);
            linkqueuenode = NULL;
        }
        return false;
    }
    return true;
}

//从队列中出一个元素相当于从链表的0号位置删除元素
//出队列的节点还要释放内存
void* LinkQueue_Retrieve(Queue* queue)
{
    void* ret = NULL;
    LinkQueueNode* linkqueuenode = NULL;
    linkqueuenode = (LinkQueueNode*)LinkList_DeleteOneNode(queue,0);
    if (linkqueuenode == NULL)
    {
        return NULL;
    }
    ret = linkqueuenode->item;
    if (linkqueuenode!= NULL)
    {
        free(linkqueuenode);
        linkqueuenode = NULL;
    }
    return ret;
}
//获取对头元素相当于获取链表0号位置元素
void* LinkQueue_Header(Queue* queue)
{
    void* ret = NULL;
    LinkQueueNode* linkqueuenode = NULL;
    linkqueuenode = (LinkQueueNode*)LinkList_GetOneNode(queue,0);
    if (linkqueuenode == NULL)
    {
        return NULL;
    }
    ret = linkqueuenode->item;
    return ret;
}

int LinkQueue_GetLength(Queue* queue)
{
    return LinkList_GetLength(queue);
}





/**********************测试代码************************/

/*
void main()
{
    int i = 0;
    int aa[10] = {0};
    Queue* queue = NULL;
    queue = LinkQueue_Create(10);
    if (queue == NULL)
    {
        printf("创建链式队列失败");
    }
    for (i = 0; i < 5; i ++)
    {
        aa[i] = aa[i] + i + 1;
        LinkQueue_Append(queue,&aa[i]);
    }

    printf("链式队列的长度是:%d \n",LinkQueue_GetLength(queue));
    printf("链式队列的头元素是:%d \n",*((int*)LinkQueue_Header(queue)));

    //出队列
    while(LinkQueue_GetLength(queue) > 0)
    {
        printf("链式队列依次出元素:%d \n",*((int*)LinkQueue_Retrieve(queue)));
    }
    //销毁队列
    LinkQueue_Destory(queue);
    system("pause");

}
*/

可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现方式。
good luck !

相关TAG标签
上一篇:QMetaObject::connectSlotsByName 分析
下一篇:Object对象目录 总览概括
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站