#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
//队列最大长度
#define N 64
typedef int data_t;
typedef struct
{
data_t data[N];
int front;
int rear;
}queue, *pqueue;
//创建队列
pqueue queue_creat();
//入队
int enqueue(pqueue p, data_t val);
//出队,返回出队元素值
data_t dequeue(pqueue p);
//判断队列是空则返回1,不是空则返回0
int queue_empty(pqueue p);
//判断队列是满则返回1,不是满则返回0
int queue_full(pqueue p);
//清空队列
int queue_clear(pqueue p);
//释放动态开辟空间
pqueue queue_free(pqueue p);
头文件Queue.h
#include "Queue.h"
pqueue queue_creat()
{
pqueue p;
p = (pqueue)malloc(sizeof(queue));
if (p == NULL)
{
printf("Malloc Error.\n");
return NULL;
}
memset(p, 0, sizeof(queue));
return p;
}
int enqueue(pqueue p, data_t val)
{
if (p == NULL)
{
printf("Pointer NULL.\n");
return -1;
}
if (queue_full(p))
{
printf("Queue is full.\n");
return -1;
}
else
{
p->rear = (p->rear) % N;
p->data[(p->rear)++] = val;
return 0;
}
}
data_t dequeue(pqueue p)
{
if (p == NULL)
{
printf("Pointer NULL.\n");
return -1;
}
data_t temp;
if (queue_empty(p))
{
printf("Queue is empty.\n");
return -1;
}
else
{
p->front = (p->front) % N;
temp = p->data[(p->front)++];
p->data[p->front - 1] = 0;
return temp;
}
}
int queue_empty(pqueue p)
{
return p->front == p->rear ? 1 : 0;
}
int queue_full(pqueue p)
{
return p->front == ((p->rear + 1)%N) ? 1 : 0;
}
int queue_clear(pqueue p)
{
if (p == NULL)
{
printf("Pointer NULL.\n");
return -1;
}
if (queue_empty(p))
{
printf("Queue is empty.\n");
return -1;
}
while (p->front != p->rear)
{
p->front = (p->front) % N;
p->data[p->front] = 0;
(p->front)++;
}
return 0;
}
pqueue queue_free(pqueue p)
{
if (p == NULL)
{
printf("Pointer NULL.\n");
return NULL;
}
free(p);
return NULL;
}
函数实现Queue.c
#include "Queue.h"
int main()
{
//test here
//
return 0;
}
测试函数test.c
通过取模可以实现对队列的循环访问