队列
来源:互联网 发布:期货蝶式套利软件 编辑:程序博客网 时间:2024/05/21 10:15
头文件:
#ifndef __MYQUEUE_H__#define __MYQUEUE_H__#define ret_val_if_fail(p, val)\ if (!(p)){printf("%s:%d error: "#p" failed.\n", __func__, __LINE__); return val;}#define ret_if_fail(p)\ if (!(p)){printf("%s:%d error: "#p" failed.\n", __func__, __LINE__); return;}struct _MyQueue;typedef struct _MyQueue MyQueue, *MyQueuePtr;MyQueuePtr myqueue_create();void myqueue_destory(MyQueuePtr thiz);int myqueue_empty(MyQueuePtr thiz);void* myqueue_front(MyQueuePtr thiz);void myqueue_pop(MyQueuePtr thiz);void myqueue_push(MyQueuePtr thiz, void* obj);#endif实现源文件:
#include <stdio.h>#include <stdlib.h>#include "myqueue.h"typedef struct _QueueNode{ void* data; struct _QueueNode* next;}QueueNode, *QueueNodePtr;struct _MyQueue{ QueueNodePtr front; QueueNodePtr back;};MyQueuePtr myqueue_create(){ MyQueuePtr retPtr = (MyQueuePtr)malloc(sizeof(MyQueue)); retPtr->front = (QueueNodePtr)malloc(sizeof(QueueNode)); memset(retPtr->front, 0, sizeof(QueueNode)); retPtr->back = retPtr->front;}void myqueue_destroy(MyQueuePtr thiz){ ret_if_fail(thiz != NULL); ret_if_fail(thiz->front != NULL); QueueNodePtr* p = thiz->front; QueueNodePtr* q = NULL; while (p != NULL) { q = p; p = p->next; free(q->data); free(q); } free(thiz);}int myqueue_empty(MyQueuePtr thiz){ ret_val_if_fail(thiz != NULL, 1);// if the queue is not created, then we say it's empty if (thiz->front == thiz->back) return 1; return 0;}void* myqueue_front(MyQueuePtr thiz){ ret_val_if_fail(thiz != NULL, NULL); ret_val_if_fail(thiz->front != NULL, NULL); ret_val_if_fail(thiz->front->next != NULL, NULL); return thiz->front->next->data;}void myqueue_pop(MyQueuePtr thiz){ ret_if_fail(thiz != NULL); ret_if_fail(thiz->front != NULL); ret_if_fail(thiz->front->next != NULL); QueueNodePtr frontNode = thiz->front->next; if (frontNode->next == NULL) thiz->back = thiz->front; thiz->front->next = frontNode->next; free(frontNode->data); free(frontNode);}void myqueue_push(MyQueuePtr thiz, void* obj){ ret_if_fail(thiz != NULL); ret_if_fail(thiz->back != NULL); QueueNodePtr newPtr = (QueueNodePtr)malloc(sizeof(QueueNode)); newPtr->next = NULL; newPtr->data = obj; thiz->back->next = newPtr; thiz->back = newPtr;}