队列(循环队列)—— 线性结构的应用之一

/**
* @brief:
* @version:
* @author: @Shiel
* @date: 2023-10-26 18:40:37
*
* 在程序结束时,应该使用 free 函数来释放分配的内存,以防止内存泄漏。
**/
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>

typedef struct Queue
{
// struct Queue* pBase;
int* pBase;
int front;
int rear;
}QUEUE, *PQUEUE; //PQUEUE == struct Queue*,即创建一个 QUEUE 类型的指针别名

void Init_Queue(PQUEUE pQ); //初始化
bool En_Queue(PQUEUE pQ, int val); //入队
bool Out_Queue(PQUEUE pQ, int* pVal); //出队
bool Full_Queue(PQUEUE pQ);
bool Empty_Queue(PQUEUE pQ);
void Traverse_Queue(PQUEUE pQ); //遍历

int main(void)
{
PQUEUE Q; //在 Init_Queue 函数中,不再需要分配内存,因为 Q 是一个指向 QUEUE 结构的指针
Q = (PQUEUE)malloc(sizeof(QUEUE)); // QUEUE == struct Queue
if (Q == NULL)
{
printf("动态内存分配失败!\n");
return 1;
}
int val;

Init_Queue(Q);
En_Queue(Q, 1);
En_Queue(Q, 2);
En_Queue(Q, 3);
En_Queue(Q, 4);
En_Queue(Q, 5);
En_Queue(Q, 6);
En_Queue(Q, 7);
Traverse_Queue(Q);

if( Out_Queue(Q, &val) )
{
printf("出队成功,出队的元素为:%d\n", val);
}
else
{
printf("出队失败!\n");
}
Traverse_Queue(Q);


//在程序结束时,应该使用 free 函数来释放分配的内存,以防止内存泄漏。
free(Q);
free(Q->pBase);
return 0;
}

void Init_Queue(PQUEUE pQ)
{
// QUEUE* pQ = (Queue)malloc(sizeof(QUEUE)); //在 Init_Queue 函数中,不再需要分配内存,因为 Q 是一个指向 QUEUE 结构的指针。
pQ->pBase = (int*)malloc(sizeof(int) * 6);
if(pQ->pBase == NULL)
{
printf("动态内存分配失败!\n");
}
else
{
pQ->front = 0;
pQ->rear = 0;
}
}

bool En_Queue(PQUEUE pQ, int val)
{
if( Full_Queue(pQ) )
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear + 1) % 6;

return true;
}
}
bool Out_Queue(PQUEUE pQ, int* pVal)
{
if( Empty_Queue(pQ) )
{
return false;
}
else
{
*pVal = pQ->pBase[pQ->front];
pQ->front = (pQ->front + 1) % 6;

return true;
}
}

bool Empty_Queue(PQUEUE pQ)
{
if(pQ->rear == pQ->front)
{
return true;
}
else
return false;
}

bool Full_Queue(PQUEUE pQ)
{
if( (pQ->rear + 1) % 6 == pQ->front )
{
return true;
}
else
return false;
}

void Traverse_Queue(PQUEUE pQ)
{
int i = pQ->front; //借助临时变量 i 来进行遍历

while(i != pQ->rear)
{
printf("%d ", pQ->pBase[i]);
i = (i + 1) % 6;
}
printf("\n");

return;
}
/**/