/**
* @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;
}else
return 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);
}
else
printf("\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;
}
输出: