C语言:写一个循环队列

#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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值