/********************************************************************************* * Copyright: (C) 2012 Guo Wenxue * All rights reserved. * * Filename: cp_queue.c * Description: This file is the queue implement based on link list. * * Version: 1.0.0(11/12/2012~) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "11/12/2012 01:25:26 PM" * ********************************************************************************/ #include "cp_queue.h" #include "cp_common.h" CP_QUEUE *cp_queue_init(CP_QUEUE *queue, int size) { if(!queue) { queue = malloc(sizeof(*queue)); } memset(queue, 0, sizeof(*queue)); queue->size = size; queue->items = 0; queue->rear = queue->front = NULL; return queue; } void *cp_enqueue(CP_QUEUE *queue, void *data) { CP_QNODE *node; if(!queue || cp_queue_is_full(queue)) { return NULL; } node = malloc(sizeof(*node)); if(NULL == node) { return NULL; } node->item = data; node->next = NULL; if(cp_queue_is_empty(queue)) { queue->front = node; } else { queue->rear->next = node; } queue->rear = node; queue->items++; return data; } void cp_travel_queue(CP_QUEUE *queue) { CP_QNODE *node; for(node=queue->front; node!=NULL; node=node->next) { printf("queue node[%p] save data [%p]\n", node, node->item); } } void *cp_rmqueue(CP_QUEUE *queue, void *data) { CP_QNODE *node, *tmp; if(!queue || cp_queue_is_empty(queue)) { return NULL; } /* The first node->item is the data, we find it */ if(queue->front->item==data) { tmp = queue->front; queue->front = queue->front->next; queue->items -= 1; free(tmp); return data; } for(node=queue->front; node!=NULL; node=node->next) { if(node->next->item == data) { tmp = node->next; queue->items -= 1; if(node->next != queue->rear) node->next = node->next->next; else { queue->rear = node; queue->rear->next = NULL; } free(tmp); return data; } } return data; } void *cp_dequeue(CP_QUEUE *queue) { CP_QNODE *node; void *item; if(!queue || cp_queue_is_empty(queue)) { return NULL; } node = queue->front; queue->front = queue->front->next; item = node->item; free(node); queue->items--; if(queue->items == 0) queue->rear = NULL; return item; } void cp_queue_destroy(CP_QUEUE *queue) { if(!queue) return ; while( !cp_queue_is_empty(queue) ) { cp_dequeue(queue); } free(queue); return ; }