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

来源:互联网 发布:ubuntu搭建php开发环境 编辑:程序博客网 时间:2024/06/04 23:20

linkqueue.h 文件

#ifndef _LINK_QUEUE_H_#define _LINK_QUEUE_H_#include <stdio.h>#include <stdlib.h>#include <string.h>typedef void Queue;typedef struct _tag_LinkQueueNode{    LinkListConnectedNode connected_node;    void* item;}LinkQueueNode;#ifndef bool#define bool int#define true 1#define false 0#endifQueue* 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 <stdio.h>#include <stdlib.h>#include <string.h>#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 !

原创粉丝点击