循环队列的基本功能:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1000
#define OVERFLOW 1
typedef struct CircleIntQueue{
int data[MAX_SIZE];
int head;
int tail;
}CircleIntQueuer,*circleintqueue;
circleintqueue initQueue() {
circleintqueue resultPtr = (circleintqueue)malloc(sizeof(CircleIntQueue));
resultPtr->head = 0;
resultPtr->tail = 0;
return resultPtr;
}
void enqueue(circleintqueue paraPtr, int Value) {
if ((paraPtr->tail + 1) % MAX_SIZE == paraPtr->head) {
printf("队列已满!!\r\n");
exit(OVERFLOW);
}
paraPtr->data[paraPtr->tail % MAX_SIZE] = Value;
paraPtr->tail++;
}
int dequeue(circleintqueue paraPtr) {
int resultValue;
if (paraPtr->head == paraPtr->tail) {
printf("队列为空.\r\n");
return -1;
} // Of if
resultValue = paraPtr->data[paraPtr->head % MAX_SIZE];
paraPtr->head++;
return resultValue;
}
void outputLinkQueue(circleintqueue paraPtr){
int i;
if (paraPtr->head == paraPtr->tail) {
printf("队列为空.");
return;
}
printf("队列的元素:");
for (i = paraPtr->head; i < paraPtr->tail; i++) {
printf("%d ", paraPtr->data[i % MAX_SIZE]);
}
printf("\r\n");
}
void testLinkQueue(){
int i = 10;
circleintqueue tempPtr = initQueue();
for (; i < 16; i ++) {
enqueue(tempPtr, i);
}
outputLinkQueue(tempPtr);
for (i = 0; i < 6; i ++) {
printf(" 依次出队:%d\r\n", dequeue(tempPtr));
}
enqueue(tempPtr, 8);
printf("入队8后:") ;
outputLinkQueue(tempPtr);
}
int main(){
testLinkQueue();
return 1;
}
运行结果:
总结:
队列为空和队列已满,前后指针都指向同一位置。这时要注意分辨情况