#ifndef GQUEUE_C #define GQUEUE_C GQUEUE_C #include void Queue_Init(struct Queue *q) { q->first=q->last=NULL; q->size=0; } void Queue_Push(struct Queue *q,void *data) { if(q==NULL)return; if(q->first==NULL) { q->first=q->last=malloc(sizeof(struct Queue_Node)); q->first->data=data; q->first->prev=NULL; ++q->size; }else { struct Queue_Node *temp=malloc(sizeof(struct Queue_Node)); q->last->prev=temp; temp->data=data; q->last=temp; ++q->size; } } void* Queue_Pop(struct Queue *q) { if(q==NULL)return NULL; if(q->size==0)return NULL; void *return_value=q->first->data; if(q->size==1) { free(q->last); q->first=q->last=NULL; q->size=0; }else { struct Queue_Node *temp_first=q->first; q->first=q->first->prev; free(temp_first); --q->size; } return return_value; } void Queue_Destroy(struct Queue *q) { struct Queue_Node *temp_first; while(q->first!=NULL) { temp_first=q->first; q->first=q->first->prev; free(temp_first->data); free(temp_first); } } #endif