头文件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; -
}