3. linux C -- 通用循环队列

来源:互联网 发布:flash.js导致请求两次 编辑:程序博客网 时间:2024/06/04 20:14

头文件voidQueue.h

#ifndef _VOID_QUEUE_H_#define _VOID_QUEUE_H_typedef enum{    FALSE = 0,    TRUE}BOOL;typedef struct myQueue{    void  *data; // 数据域    int size;    // 数据域的大小    int Front;    int Rear;    int MaxLen;  // 队列的最大长度}voidQueue;typedef void (queue_op_t)(void *);typedef int (queue_cmp_t)(void *, void *);BOOL initQueue(voidQueue *pQueue, int size, int maxLen);  // 初始化队列BOOL isFullQueue(voidQueue *pQueue); // 判断队列是否已满BOOL isEmptyQueue(voidQueue *pQueue);// 判断队列是否已空BOOL enQueue(voidQueue *pQueue, void *data); // 添加数据BOOL delQueue(voidQueue *pQueue, void *data); // 获取数据void traverseQueue(voidQueue *pQueue, queue_op_t * opt); // 遍历队列void destroyedQueue(voidQueue *pQueue);int getQueueCount(voidQueue *pQueue); // 得到队列的当前长度#endif


实现头文件中的功能


1. 初始化队列

    参数:队列指针

               数据域的大小

               队列的最大长度

   返回值:成功返回值, 失败返回FALSE

循环队列的最后一个项需要为空,不然无法去判断队列是满还是空,所以申请空间时要多申请一个才会得到需要的队列大小

BOOL initQueue(voidQueue *pQueue, int size, int maxLen){    pQueue->data = malloc(size * (maxLen+1));    if (NULL == pQueue->data)    {        return FALSE;    }    pQueue->Front = 0;    pQueue->Rear = 0;    pQueue->size = size;    pQueue->MaxLen = maxLen + 1;    return TRUE;}

2. 判断队列是否已满

    参数:队列指针
    返回值:已满返回TRUE, 没满返回FALSE

BOOL isFullQueue(voidQueue *pQueue){    if(pQueue->Front == (pQueue->Rear + 1) % pQueue->MaxLen)    {        return TRUE;    }    else    {        return FALSE;    }}

3. 判断队列是否为空

    参数:队列指针
    返回值:已满返回TRUE, 没满返回FALSE

BOOL isEmptyQueue(voidQueue *pQueue){    if (pQueue->Front == pQueue->Rear)    {        return TRUE;    }    else    {        return FALSE;    }}
4. 添加数据

    参数:队列指针

              需要添加的数据

    返回值: 成功返回TRUE,失败返回FALSE

BOOL enQueue(voidQueue *pQueue, void *data){    if (isFullQueue(pQueue))    {        return FALSE;    }    memcpy(pQueue->data + pQueue->size * pQueue->Rear, data, pQueue->size);    pQueue->Rear = (pQueue->Rear + 1) % pQueue->MaxLen;    return TRUE;}

4. 获取数据

    参数:队列指针

              存储获取数据的指针

    返回值: 成功返回TRUE,失败返回FALSE

BOOL delQueue(voidQueue *pQueue, void *data){    if (isEmptyQueue(pQueue))    {        return FALSE;    }    memcpy(data, pQueue->data + pQueue->size * pQueue->Front, pQueue->size);    memset(pQueue->data + pQueue->size * pQueue->Front, 0, pQueue->size);    pQueue->Front = (pQueue->Front + 1) % pQueue->MaxLen;    return TRUE;}

5. 遍历队列

    参数:队列指针

               对遍历到的数据域操作的函数指针

    返回值:无

void traverseQueue(voidQueue *pQueue, queue_op_t *opt){    if (isEmptyQueue(pQueue))    {        return ;    }    int i = pQueue->Front;    printf("queue element start: \n");    while (i % pQueue->MaxLen != pQueue->Rear)    {        opt(pQueue->data + (i % pQueue->MaxLen) * pQueue->size);        i++;    }    printf("traverse end\n");}

6. 得到队列的当前长度

    参数:队列指针

    返回值:队列的长度

int getQueueCount(voidQueue *pQueue){    int count = 0;    if (isEmptyQueue(pQueue))    {        return count;    }    int i = pQueue->Front;    while (i % pQueue->MaxLen != pQueue->Rear)    {        i++;        count++;    }    return count;}

7. 销毁队列

    参数:队列指针

   返回值:无

void destroyedQueue(voidQueue *pQueue){    if (NULL != pQueue->data)    {        free(pQueue->data);        pQueue->data = NULL;    }}


voidQueue.c

#include <stdio.h>#include <string.h>#include <stdlib.h>#include "voidQueue.h"BOOL initQueue(voidQueue *pQueue, int size, int maxLen){    pQueue->data = malloc(size * (maxLen+1));    if (NULL == pQueue->data)    {        return FALSE;    }    pQueue->Front = 0;    pQueue->Rear = 0;    pQueue->size = size;    pQueue->MaxLen = maxLen + 1;    return TRUE;}BOOL isFullQueue(voidQueue *pQueue){    if(pQueue->Front == (pQueue->Rear + 1) % pQueue->MaxLen)    {        return TRUE;    }    else    {        return FALSE;    }}BOOL isEmptyQueue(voidQueue *pQueue){    if (pQueue->Front == pQueue->Rear)    {        return TRUE;    }    else    {        return FALSE;    }}BOOL enQueue(voidQueue *pQueue, void *data){    if (isFullQueue(pQueue))    {        return FALSE;    }    memcpy(pQueue->data + pQueue->size * pQueue->Rear, data, pQueue->size);    pQueue->Rear = (pQueue->Rear + 1) % pQueue->MaxLen;    return TRUE;}BOOL delQueue(voidQueue *pQueue, void *data){    if (isEmptyQueue(pQueue))    {        return FALSE;    }    memcpy(data, pQueue->data + pQueue->size * pQueue->Front, pQueue->size);    memset(pQueue->data + pQueue->size * pQueue->Front, 0, pQueue->size);    pQueue->Front = (pQueue->Front + 1) % pQueue->MaxLen;    return TRUE;}void traverseQueue(voidQueue *pQueue, queue_op_t *opt){    if (isEmptyQueue(pQueue))    {        return ;    }    int i = pQueue->Front;    printf("queue element start: \n");    while (i % pQueue->MaxLen != pQueue->Rear)    {        opt(pQueue->data + (i % pQueue->MaxLen) * pQueue->size);        i++;    }    printf("traverse end\n");}int getQueueCount(voidQueue *pQueue){    int count = 0;    if (isEmptyQueue(pQueue))    {        return count;    }    int i = pQueue->Front;    while (i % pQueue->MaxLen != pQueue->Rear)    {        i++;        count++;    }    return count;}void destroyedQueue(voidQueue *pQueue){    if (NULL != pQueue->data)    {        free(pQueue->data);        pQueue->data = NULL;    }}





8. 实例测试 main.c

    

#include <stdio.h>#include "voidQueue.h"void printQueueData(void *data){    int *temp = (int *)data;    printf("queue:  %d\n", *temp);}int main(void){    voidQueue testQueue;    initQueue(&testQueue, sizeof(int), 5);    int ret = isEmptyQueue(&testQueue);    if (ret)    {        printf("11 testQueue is empty\n");    }    int addElement;    addElement = 1;    enQueue(&testQueue, &addElement);    addElement = 2;    enQueue(&testQueue, &addElement);    addElement = 3;    enQueue(&testQueue, &addElement);    traverseQueue(&testQueue, printQueueData);    printf("queue count: %d\n", getQueueCount(&testQueue));    printf("++++++++++++++++++++++++++++++++++++++++++++++++\n");    int delElement;    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    printf("------------------------------------------------\n");    addElement = 1;    enQueue(&testQueue, &addElement);    addElement = 2;    enQueue(&testQueue, &addElement);    addElement = 3;    enQueue(&testQueue, &addElement);    addElement = 4;    enQueue(&testQueue, &addElement);    addElement = 5;    enQueue(&testQueue, &addElement);    addElement = 6;    enQueue(&testQueue, &addElement);    traverseQueue(&testQueue, printQueueData);    printf("queue count: %d\n", getQueueCount(&testQueue));    printf("====================================================\n");    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    if (delQueue(&testQueue, &delElement))    {        printf("delElement: %d\n", delElement);    }    else    {        printf("queue is already empty\n");    }    printf("*****************************************************\n");    addElement = 9;    enQueue(&testQueue, &addElement);    traverseQueue(&testQueue, printQueueData);    printf("queue count: %d\n", getQueueCount(&testQueue));    destroyedQueue(&testQueue);    printf("Hello World!\n");    return 0;}