写在前面——
为了解决上文所提到的“不小心”出队的问题,我们引入循环的思想,先将头尾指针置于尾部,这样在执行入队操作的时候,头指针就会被“挤”到开头的位置去了,这样就有效的避免了无意间将一些数据挤出队列的问题。
图示:
以1.2.3.4的运算为例。
代码实现:
#include <malloc.h>
#define TOTAL_SPACE 5
//循环队列的定义
typedef struct xunhuanduilie{
int data[TOTAL_SPACE];
int head;
int tail;
}*xunhuanduiliePtr;
//初始化
xunhuanduiliePtr initduilie() {
xunhuanduiliePtr resultPtr = (xunhuanduiliePtr)malloc(sizeof(struct xunhuanduilie));
resultPtr->head = 0;
resultPtr->tail = 0;
return resultPtr;
}
//入队
void enqueue(xunhuanduiliePtr paraPtr, int paraValue) {
if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
printf("Queue full.\r\n");
return;
}
paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
paraPtr->tail++;
}
//出队
int dequeue(xunhuanduiliePtr paraPtr) {
int resultValue;
if (paraPtr->head == paraPtr->tail) {
printf("No element in the queue.\r\n");
return -1;
}
resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
paraPtr->head++;
return resultValue;
}
//打印
void outputLinkQueue(xunhuanduiliePtr paraPtr){
int i;
if (paraPtr->head == paraPtr->tail) {
printf("Empty queue.");
return;
}
printf("Elements in the queue: ");
for (i = paraPtr->head; i < paraPtr->tail; i++) {
printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
}
printf("\r\n");
}
/**
* Unit test.
*/
void testLinkQueue(){
int i = 10;
xunhuanduiliePtr tempPtr = initduilie();
for (; i < 16; i ++) {
enqueue(tempPtr, i);
}//Of for i
outputLinkQueue(tempPtr);
for (i = 0; i < 6; i ++) {
printf("dequeue gets %d\r\n", dequeue(tempPtr));
}//Of for i
enqueue(tempPtr, 8);
outputLinkQueue(tempPtr);
}//Of testLinkQueue
int main(){
testLinkQueue();
return 1;
}
注意事项:
1.一定要检查队列是否为空。一旦没有检查这一步,一次入队操作,就将返回一未知的值。
2.队头,队尾指针的书写要确保遵循相同的例程。