双端链表实现队列

时间:2022-10-03 17:41:56

     这次实现队列还是用到了双端链表,和上篇的一样,也是双端链表实现的,简单么,下面写好了,上面直接调用。现在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);
}