队列就和生活中排队一样是一种先进先出的数据结构
头文件:
#ifndef queue_h
#define queue_h
#include <stdio.h>
#define queue_size(queue) ((queue)->size)
typedef struct QueueElement_{
void *data;
struct QueueElement_ *next;
} QueueElement,* QueueElementP;
typedef struct Queue_{
int size;
void (*destroy) (void *data);
QueueElementP head;
QueueElementP tail;
}Queue,*QueueP;
void queue_init(QueueP queue,void (*destroy) (void *data));
void queue_destroy(QueueP queue);
int queue_enqueue(QueueP queue,void *data);
int queue_dequeue(QueueP queue,void **data);
void * queue_peek(QueueP queue);
#endif /* queue_h */
源文件:
#include "queue.h"
#include <stdlib.h>
#include <string.h>
void queue_init(QueueP queue,void (*destroy) (void *data)){
queue->destroy=destroy;
queue->size=0;
queue->head=NULL;
queue->tail=NULL;
}
void queue_destroy(QueueP queue){
void * data;
while (queue_size(queue)>0) {
if(queue_dequeue(queue, &data)&&queue->destroy!=NULL)
queue->destroy(data);
}
memset(queue, 0, sizeof(Queue));
}
int queue_enqueue(QueueP queue,void *data){
QueueElementP ele=malloc(sizeof(QueueElement));
if(!ele)
return 0;
ele->data=data;
ele->next=NULL;
int size=queue_size(queue);
queue->size++;
if(size==0){
queue->head=ele;
}else{
queue->tail->next=ele;
}
queue->tail=ele;
return 1;
}
int queue_dequeue(QueueP queue,void **data){
int size=queue_size(queue);
if(size==0)
return 0;
queue->size--;
QueueElementP head=queue->head;
if(queue->size==0){
queue->head=NULL;
queue->tail=NULL;
}else{
queue->head=head->next;
}
*data=head->data;
free(head);
return 0;
}
void * queue_peek(QueueP queue){
int size=queue_size(queue);
if(size==0)
return NULL;
return queue->head->data;
}