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