您的位置:首页 > 其它

双端链表实现队列

2015-12-09 17:59 639 查看
这次实现队列还是用到了双端链表,和上篇的一样,也是双端链表实现的,简单么,下面写好了,上面直接调用。现在redis竟然是用C语言写的,而且底层实现也是双端链表,这是非常重要滴

queue.h文件
#ifndef _QUEUE_H_
#define _QUEUE_H_

#include "tools.h"
typedef struct Queue
{
    Dlist *dlist;   //封装双端链表为队列的控制信息
}Queue;

//队列的接口
Qeuue *queue_init(void);   //对列的初始化
void destroy_queue(Queue **queue);    //队列的销毁
void in(Queue *queue, void *value);   //入队操作
Boolean out(Queue *queue);    //出队操作
Boolean get_queue_front(Queue *queue, void **value);   //得到队首元素
Boolean is_queue_empty(Queue *queue);   //判断队列是否为空
int get_queue_count(Queue *queue);   //得到队列元素个数

#endif


queue.c文件

#include "queue.h"

//队列的初始化
Queue *init_queue(void)
{
    Queue *queue = (Queue *)Malloc(sizeof(Queue));
    queue->dlist = init_queue();
    bzero(queue,sizeof(Queue));

    return queue;
}

//队列的销毁
void destroy_queue(Queue **queue)
{
    Dlist_node *p_node = NULL;
    if(queue == NULL || *queue == NULL){
      return ;
    }
     
    destroy_dlist(&((*queue)->dlist));
    free(*queue);
    *queue = NULL;

}

//入队操作
void in_queue(Queue *queue,void *value)
{
   if(queue == NULL || value == NULL){
      return ;
   }

   push_back(queue->dlist,value);

}

//出队操作
Boolean out_queue(Queue *queue)
{
    if(queue == NULL || is_queue_empty(queue)){
      return FALSE;
    }

    pop_front(queue->dlist);

    return TRUE;
}

//得到队首元素
Boolean is_queue_empty(Queue *queue)
{

  return queue->dlist->count == ZERO;
}

//判断队列是否为空
Boolean get_queue_front(Queue *queue,void **value)
{
  if(queue == NULL ||  value == NULL 
    || is_stack_empty(queue)
    || get_front(queue->dlist,value) == FALSE{
        return FALSE;
   }
   
  return TRUE;
}

//得到队列元素个数
int get_queue_count(Queue *queue)
{
  if(queue == NULL){
    return ERROR;
  }
  return get_dlist_count(queue->dlist);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: