デュアルエンドチェーンテーブル実装キュー

1934 ワード

今回の実装キューはやはり両端チェーンテーブルを使いました.前編と同じように、両端チェーンテーブルで実装されています.簡単ですか.下に書いてあります.上から直接呼び出します.今では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);
}