#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"); }
C语言:写一个循环队列
最新推荐文章于 2022-08-31 10:16:53 发布