链式队列的代码实现

  • 头文件
#ifndef __LINK_QUEUE_H__
#define __LINK_QUEUE_H__

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "TLinkList.h"

typedef void LinkQueue;
typedef struct _tagNode{//和链式栈一样需要把队列的业务节点包裹进链表的业务节点
    LinkListNode node;
    void *item;//指向真正的队列的业务节点(数据对象)
}LinkQueueNode;

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
  • 实现文件
#include "linkqueue.h"
#include "TLinkList.h"

LinkQueue * LinkQueue_Create()
{
    return LinkList_Create();
}

void LinkQueue_Destroy(LinkQueue *queue)
{
    LinkQueue_Clear(queue);
    LinkList_Destroy((LinkList *)queue);
}

/*需要显示的将每一个元素弹出队列--释放每一个链表节点的内存*/
void LinkQueue_Clear(LinkQueue *queue)
{
    while (LinkQueue_Length(queue) > 0)
    {
        LinkQueue_Retrieve(queue);
    }

    LinkList_Clear((LinkList *)queue);
}

/*向队列中添加元素相当于向线性表的尾部添加元素
向队列中添加一个节点就malloc一个节点的内存*/
int LinkQueue_Append(LinkQueue* queue, void *item)
{
    LinkQueueNode * tmp = NULL;
    int ret = 0;
    tmp = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if (NULL == tmp)
    {
        printf("malloc failed!\n");
        return -1;
    }
    memset(tmp, 0, sizeof(LinkQueueNode));//做一个负责任的人

    tmp->item = item;//将队列的业务节点包含进链表的的业务节点

    ret = LinkList_Insert((LinkList *)queue, (LinkListNode*)tmp, LinkList_Length((LinkList *)queue));

    if (ret != 0)
    {
        printf("insert error!\n");
        if (tmp != NULL)
        {
            free(tmp);
            tmp = NULL;
        }   
        return ret;
    }
    return ret;
}

/*相当于从线性表的头部删除节点*/
void *LinkQueue_Retrieve(LinkQueue *queue)
{
    LinkQueueNode * tmp = NULL;

    void * ret = NULL;

    /*删除元素*/
    tmp = (LinkQueueNode *)LinkList_Delete((LinkList*)queue,0);
    if (tmp == NULL)
    {
        printf("delete error!\n");
        return NULL;
    }

    if (tmp != NULL)
    {
        ret = tmp->item;//缓存数据对象(队列的业务节点)的起始地址
        free(tmp);//每出一个元素就要回收内存
        tmp = NULL;
    }

    return ret;//返回数据对象起始地址
}

/*相当于从链表头部获取数据*/
void *LinkQueue_Header(LinkQueue *queue)
{
    LinkQueueNode * tmp = NULL;

    tmp = (LinkQueueNode *)LinkList_Get((LinkList*)queue, 0);
    if (tmp == NULL)
    {
        printf("LinkList_Get error!\n");
        return NULL;
    }

    return tmp->item;
}

int LinkQueue_Length(LinkQueue* queue)
{
    return LinkList_Length((LinkList*)queue);
}
  • 测试文件

#include "linkqueue.h"
int main(void)
{
    LinkQueue *queue = NULL;
    int  i = 0;
    int a[10] = {0};

    /*创建队列*/
    queue = LinkQueue_Create();
    if (NULL == queue)
    {
        printf("Create error!\n");
        return -1;
    }

    /*插入数据对象*/
    for (i = 0; i < 5;i++)
    {
        a[i] =i+1;
        LinkQueue_Append(queue, (void*)&a[i]);
    }

    /*打印属性*/
    printf("len:%d\n",LinkQueue_Length(queue));
    printf("head:%d\n", *(int*)LinkQueue_Header(queue));

    /*从队列头部取出元素*/
    while (LinkQueue_Length(queue)>0)
    {
        printf("retrieve:%d\n", *(int*)LinkQueue_Retrieve(queue));
    }

    /*销毁队列*/
    LinkQueue_Destroy(queue);

    system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值