#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
//循环队列
#define SIZE 10
typedef int ElemType;
typedef struct {
ElemType *pBase;
int front;
int rear;
} QUENE,* PQUENE;
void init(PQUENE);
bool is_full(QUENE);
bool is_empty(QUENE);
bool en_quene(PQUENE, ElemType);//入队
_Bool out_quene(PQUENE, ElemType*);//出队
void tranverse(QUENE *);
void testIn(PQUENE);
void testIn2(PQUENE);
void testOut(PQUENE);
void clear(PQUENE);
void main(void){
QUENE quene;
init(&quene);
testIn(&quene);//入队
tranverse(&quene);
testOut(&quene);//出队
tranverse(&quene);
testIn2(&quene);//入队
tranverse(&quene);
clear(&quene);
tranverse(&quene);
}
void testIn(PQUENE pQuene){
for (int i = 5; i <= 15; i++){
en_quene(pQuene, i);
}
}
void testIn2(PQUENE pQuene){
for (int i = 10; i <= 15; i++){
en_quene(pQuene, i);
}
}
void testOut(PQUENE pQuene){
int val;
for (int i = 1; i<=2; i++){
if (out_quene(pQuene, &val)){
printf("出队成功,出队元素为:%d \n", val);
}
}
}
void init(PQUENE qQuene){
qQuene->pBase = (ElemType *)malloc(sizeof(ElemType)* SIZE);//假设队列的长度为6
qQuene->front = 0;
qQuene->rear = 0;
}
bool is_full(QUENE quene){
return (quene.rear + 1) % SIZE == quene.front;
}
bool is_empty(QUENE quene){
return quene.rear == quene.front;
}
bool en_quene(PQUENE pQuene, int val){
if (is_full(*pQuene)){
printf("入队失败,队列已满,失败元素为: %d ... \n",val);
return false;
}
printf("入队前:rear = %d ,元素为: %d ", pQuene->rear,val);
pQuene -> pBase[pQuene->rear] = val;
printf(", 地址为:%x ", &(pQuene->pBase[pQuene->rear]));
pQuene->rear = (pQuene->rear + 1) % SIZE;
printf(",入队后:rear = %d\n", pQuene->rear);
return true;
}
bool out_quene(PQUENE pQuene, ElemType *pVal){
if (is_empty(*pQuene)){
printf("出队失败,队列为空 ...\n");
return false;
}
*pVal = pQuene->pBase[pQuene->front];
pQuene->front = (pQuene->front + 1) % SIZE;
return true;
}
void tranverse(PQUENE pQuene){
printf("遍历:");
if (is_empty(*pQuene)){
printf("队列为空 ... ");
}else{
int i = pQuene->front;
while (i != pQuene->rear){
printf("%d ", pQuene->pBase[i]);
i = (i + 1) % SIZE;
}
}
printf("\n");
}
void clearElem(ElemType * pVal){
free(pVal);
}
void clear(PQUENE pQuene){
ElemType* val;
val = pQuene->pBase;
clearElem(val);//清空队列内存,申请的连续内存空间,只要传入首地址
printf("pBase = %x,pBase.value = %d \n", pQuene->pBase + 1, *(pQuene->pBase + 1));
while (pQuene->front != pQuene->rear && pQuene ->pBase != NULL){
printf("pQuene->front = %d,pBase = %x,pBase.value = %d \n", pQuene->front, pQuene->pBase, *(pQuene->pBase));
//val = pQuene->pBase;
//pQuene->pBase = pQuene->pBase+1;
val = &(pQuene->pBase[pQuene->front]);
printf("清空元素 %d 的内存后,pBase = %x ", *val, pQuene->pBase);
//clearElem(val);
pQuene->front = (pQuene->front + 1) % SIZE;
printf("pQuene->front = %d ,pQuene->rear = %d \n", pQuene->front, pQuene->rear);
}
pQuene->front = NULL;
pQuene->rear = NULL;
printf("清空队列成功 ... \n");
}