数据结构之循环队列
#include <stdio.h>
#include <stdlib.h>
#define kMyCycleQueueDefaulMaxSize 10
typedef struct MyCycleQueueNode
{
int data;
struct MyCycleQueueNode *front;
}MyCycleQueueNode;
typedef struct MyCycleQueue
{
int length;
int maxSize;
MyCycleQueueNode *head;
MyCycleQueueNode *real;
}MyCycleQueue;
MyCycleQueue* MyCycleQueue_create(int maxSize)
{
MyCycleQueue *queue = (MyCycleQueue *)malloc(sizeof(MyCycleQueue));
queue->length = 0;
// queue->maxSize = maxSize < 10 ? kMyCycleQueueDefaulMaxSize : maxSize;
queue->maxSize = 3;
queue->head = NULL;
queue->real = NULL;
return queue;
}
int MyCycleQueue_isEmpty(MyCycleQueue *queue)
{
if(queue != NULL)
{
return queue->length == 0 ? 1 : 0;
}
return 1;
}
int MyCycleQueue_isFull(MyCycleQueue *queue)
{
if(queue != NULL)
{
if(queue->length < queue->maxSize)
{
return 0;
}
}
return 1;
}
void MyCycleQueue_enqueue(MyCycleQueue *queue, int data)
{
if(queue == NULL) return; // null
if(MyCycleQueue_isFull(queue)) return;
MyCycleQueueNode *node = NULL;
if(queue->real != NULL && queue->real->front != NULL)
{
node = queue->real->front;
}
else
{
node = (MyCycleQueueNode *)malloc(sizeof(MyCycleQueueNode));
node->front = NULL;
}
node->data = data;
if(queue->head == NULL)
{
queue->head = node;
}
else
{
queue->real->front = node;
}
queue->real = node;
queue->length ++;
if(queue->maxSize <= queue->length && queue->real->front == NULL)
{
queue->real->front = queue->head;
}
}
int MyCycleQueue_dequeue(MyCycleQueue *queue)
{
if(queue == NULL || queue->length == 0) return 0;
MyCycleQueueNode *node = queue->head;
queue->head = node->front;
queue->length --;
int data = node->data;
node->data = 0;
return data;
}
void MyCycleQueue_myprintln(MyCycleQueue *queue)
{
if(MyCycleQueue_isEmpty(queue)) return;
printf("\n");
MyCycleQueueNode *p = queue->head;
for(int i = 0; i < queue->length; i ++)
{
printf("%d ", p->data);
p = p->front;
}
}
void main()
{
MyCycleQueue *queue = MyCycleQueue_create(3);
MyCycleQueue_enqueue(queue, 10);
MyCycleQueue_enqueue(queue, 9);
MyCycleQueue_enqueue(queue, 30);
MyCycleQueue_enqueue(queue, 100);
MyCycleQueue_myprintln(queue);
int data = MyCycleQueue_dequeue(queue);
MyCycleQueue_myprintln(queue);
MyCycleQueue_enqueue(queue, 99);
MyCycleQueue_myprintln(queue);
}