/*** @file TakeNumber.h* @author your name (geovindu)* @brief * @version 0.1* @date 2023-10-20* * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */#ifndef TAKENUMBER_H
#define TAKENUMBER_H#include <stdio.h>
#include <stdlib.h>//循环队列
#define QUEUEMAX 15/*** @brief 排队结构体 **/
typedef struct
{int num; //顾客编号long time;//进入队列时间
}DATA;/*** @brief 队列数组 **/
typedef struct
{DATA data[QUEUEMAX];int head; //队头int tail; //队尾
}QueueCalling;/*** @brief 初始化队列 ** @return CycQueue**/
QueueCalling *QueueInit();/*** @brief 释放队列** @param q 队列数组*/
void QueueFree(QueueCalling *q);/*** @brief 队列是否为空 ** @param q 队列数组* @return int*/
int QueueIsEmpty(QueueCalling *q);/*** @brief 队列是否已满** @param q 队列数组* @return int*/
int QueueIsFull(QueueCalling *q);/*** @brief 入队函数** @param q 队列数组* @param data* @return int*/
int QueueIn(QueueCalling *q,DATA data);/*** @brief 循环队列的出队函数 ** @param q 队列数组* @return DATA**/
DATA *QueueOut(QueueCalling *q);/*** @brief 获取队列长度** @param q 队列数组* @return int 返回有多少个排队人员*/
int QueueLen(QueueCalling *q); /*** @brief 获取队定中第1个位置的数据** @param q 队列数组* @return DATA**/
DATA *QueuePeek(QueueCalling *q);#endif/*** @file TakeNumber.c* @author your name (you@domain.com)* @brief * @version 0.1* @date 2023-10-20* * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "include/TakeNumber.h"/*** @brief 初始化队列 **/
QueueCalling *QueueInit()
{QueueCalling *q;if(q=(QueueCalling *)malloc(sizeof(QueueCalling))) //申请保存队列的内存{q->head = 0;//设置队头q->tail = 0;//设置队尾return q;}elsereturn NULL; //返回空
}
/*** @brief 释放队列 * @param q 队列数组*/
void QueueFree(QueueCalling *q)
{if (q!=NULL)free(q);
}/*** @brief 队列是否为空* @param q 队列数组*/
int QueueIsEmpty(QueueCalling *q)
{return (q->head==q->tail);
}/*** @brief 队列是否已满* @param q 队列数组*/
int QueueIsFull(QueueCalling *q)
{return ((q->tail+1)%QUEUEMAX==q->head);
}/*** @brief 入队函数* @param q 队列数组* @param data 排队信息结构体**/
int QueueIn(QueueCalling *q,DATA data)
{if((q->tail+1)%QUEUEMAX == q->head ){printf("队列满了!\n");return 0;}else{q->tail=(q->tail+1)%QUEUEMAX;//求列尾序号q->data[q->tail]=data;return 1;}
}/*** @brief 循环队列的出队函数* @param q 队列数组*/
DATA *QueueOut(QueueCalling *q)
{if(q->head==q->tail) //队列为空{printf("队列空了!\n");return NULL;}else{q->head=(q->head+1)%QUEUEMAX;return &(q->data[q->head]);}
}/*** @brief 获取队列长度* @param q 队列数组*/
int QueueLen(QueueCalling *q)
{int n;n=q->tail-q->head;if(n<0)n=QUEUEMAX+n;return n;
}/*** @brief 获取队定中第1个位置的数据* @param q 队列数组*/
DATA *QueuePeek(QueueCalling *q)
{if(q->head==q->tail){printf("队列已经空了!\n");return NULL;}else{return &(q->data[(q->head+1)%QUEUEMAX]);}
}
/*** @file CheckTieck.h* @author your name (geovindu)* @brief * @version 0.1* @date 2023-10-20* * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */#ifndef CHECKTIECK_H
#define CHECKTIECK_H#include <stdio.h>
#include <stdlib.h>
#include "TakeNumber.h"/*** @brief 新增顾客排列 ** @param q 队列数组**/
void add(QueueCalling *q);/*** @brief 通知下一顾客准备 ** @param q 队列数组**/
void next(QueueCalling *q);#endif/*** @file CheckTieck.c* @author your name (geovindu)* @brief * @version 0.1* @date 2023-10-20* * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "include/CheckTieck.h"
#include "include/TakeNumber.h"//顾客序号
int num;/*** @brief 新增顾客排列* @param q*/
void add(QueueCalling *q)
{DATA data;if(!QueueIsFull(q)) //如果队列未满{data.num=++num;data.time=time(NULL);QueueIn(q,data);}elseprintf("\n排队的人实在是太多了,请您稍候再排队!\n");
}/*** @brief 通知下一顾客准备* @param q**/
void next(QueueCalling *q)
{DATA *data;if(!QueueIsEmpty(q)) //若队列不为空{data=QueueOut(q); //取队列头部的数据printf("\n欢迎编号为%d的顾客到柜台办理业务!\n",data->num);}if(!QueueIsEmpty(q)) //若队列不为空{data=QueuePeek(q);//取队列中指定位置的数据printf("请编号为%d的顾客做好准备,马上将为您办理业务!\n",data->num); }
}
调用:
/*** @file helloworld.c* @author your name (geovindu)* @brief * IDE vscode Ubuntu 20.* @version 0.1* @date 2023-10-20* * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
#include "include/CheckTieck.h"
#include "include/TakeNumber.h"int main()
{printf("hello wolrd, c launguage! weblcome geovindu!涂聚文");QueueCalling *queue1;char select='1';//int num=1;//顾客序号int num=0; //叫号编号queue1=QueueInit(); //初始化队列if(queue1==NULL){printf("创建队列时出错!\n");//getch();getchar();return 0;}do{//这样处理,不会显示两次选择列表if(select=='1' || select=='2'){printf("\n请选择具体操作:\n");printf("1.新到顾客\n");printf("2.下一个顾客\n");printf("0.退出\n") ;fflush(stdin);}select=getchar();//getch();switch(select){case '1':add(queue1);printf("\n现在共有%d位顾客在等候!\n",QueueLen(queue1));break;case '2':next(queue1);printf("\n现在共有%d位顾客在等候!\n",QueueLen(queue1));break;case '0':break;} }while(select!='0');QueueFree(queue1); //释放队列//getch();getchar();return 0;
}
输出: