c: Queue Calling

news2024/11/29 11:34:08

/**
 * *****************************************************************************
 * @file        TakeNumber.h
 * @brief       排队等号
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-10-19
 * @copyright   geovindu 站在巨人的肩膀上 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
 * @brief       排队等号
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-10-19
 * @copyright   geovindu 站在巨人的肩膀上 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
 * @brief       排队等号
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-10-19
 * @copyright   geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
 * *****************************************************************************
 */
 
#ifndef CHECKTIECK_H
#define CHECKTIECK_H
 
 
#include <stdio.h>
#include <stdlib.h>
#include "TakeNumber.h"
 
//顾客序号
  int num;
 
/**
 * @brief     新增顾客排列  
 *
 * @param       q  队列数组
 *
 */
void add(QueueCalling *q);
 
/**
 * @brief    通知下一顾客准备   
 *
 * @param       q  队列数组
 *
 */
void next(QueueCalling *q);
 
#endif

/**
 * *****************************************************************************
 * @file        CheckTieck.c
 * @brief       排队等号
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-10-19
 * @copyright   geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
 * *****************************************************************************
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include "include/CheckTieck.h"
 
 
 
 
 
/**
 * @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);     
    }
}

调用:

#include "include/CheckTieck.h"
#include "include/TakeNumber.h"
 
 
 
 
 
 
int main()
{
 
    printf("hello c world \n");
    printf("你好,中国\n");
 
    QueueCalling *queue1;
     
    char select;
    //int num=1;//顾客序号
    num=0; //叫号编号
    queue1=QueueInit(); //初始化队列
    if(queue1==NULL)
    {
        printf("创建队列时出错!\n");
        getch();
        return 0;
    }
    do{
        printf("\n请选择具体操作:\n");
        printf("1.新到顾客\n");
        printf("2.下一个顾客\n");
        printf("0.退出\n") ;
        fflush(stdin);
        select=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();
 
 
 
    //内存分配函数 malloc()  分配并初始化函数 calloc() 重新分配内存函数 realloc 释放内存free()
    int *buf1,* buf2, * buf3;
    buf1=(int*)malloc(100*sizeof(int));
    buf2=(int*)calloc(100,sizeof(int));
    buf3=(int*)realloc(buf2,500*sizeof(int));
    free(buf1);
    free(buf3);
 
  return 0; 
}

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新高德商家信息导出(公开信息)

本章教程,主要介绍一下,如何从高德地图中根据关键词,获取商家信息,并导出Excel。 官网地址:高德地图 - 精准专业的手机地图 教程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 目录 一、需求分析 二、程序代码 三、结果展示

【操作系统】线程的实现方式:用户线程和内核线程

1 用户级线程 完全在用户空间中实现和管理的线程。 它们的创建、同步和调度由应用程序通过用户级别的线程库实现&#xff0c;所有的线程管理工作都由应用程序负责&#xff0c;无需操作系统内核干预。在用户看来有多个线程&#xff0c;但操作系统并不能意识到线程的存在。 缺点…

vmware 16pro安装 mac10.14.6,期间遇到的问题

1、分配硬盘内存尽量分大点&#xff0c;建议是40g&#xff0c;我分了80g&#xff0c;后面下载解压xcode发现还不够&#xff0c;又增加最后分了120g 2、安装过程&#xff0c;卡在选语言的地方&#xff0c;鼠标和键盘无法操作。需要在虚拟机设置中&#xff0c;勾选以下选项“显示…

vue 树状结构数据渲染 (java 处理 list ->树状)

树状结构 Element ui https://element.eleme.cn/#/zh-CN/component/tree <el-tree :data"data" :props"defaultProps" node-click"handleNodeClick"></el-tree><script>export default {data() {return {data: [{label: 一级…

1815_ChibiOS中的虚拟定时器

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 这个功能其实类似于FreeRTOS的设计&#xff0c;在FreeRTOS中也有这样的设计。 2. 一次性的定时器&#xff0c;这个不仅在FreeRTOS中见过&#x…

shell命令以及运行原理和lLinux权限

shell命令以及运行原理 什么是shell shell是操作系统的外壳程序统称&#xff0c;我们是通过shell去和操作系统沟通的。 从技术角度&#xff0c;shell最简单的定义就是命令行解释器&#xff0c;主要包含两个功能&#xff1a; 将使用者的命令翻译给核心处理 将核心的处理结果…

《数据结构、算法与应用C++语言描述》使用C++语言实现链表队列

《数据结构、算法与应用C语言描述》使用C语言实现链表队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…

告别传统纸质期刊,电子期刊更环保更快捷

​【新发现】随着科技的发展&#xff0c;电子期刊逐渐取代了传统的纸质期刊&#xff0c;成为人们获取信息的新选择。电子期刊不仅环保&#xff0c;而且快捷方便&#xff0c;但是你知道怎么制作电子期刊吗&#xff1f; 不会制作的可以试试我推荐的这个网站----FLBOOK电子杂志制作…

Simulink 最基础教程(一)

1.1基本概念 一个典型的Simulink模型大致如上图这样&#xff1a; 1&#xff09;模块 block&#xff1a;图中画圈的那些&#xff0c;每个模块可以完成一些特定的任务&#xff0c;类似MATLAB中函数的概念。软件提供了很多模块&#xff0c;当然也可以自定义新的模块 2&#xff0…

进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式

目录 1.0 Collection 类的说明 1.1 Collection 类中的实例方法 2.0 Collection 集合的遍历方式&#xff08;重点&#xff09; 2.1 使用迭代器&#xff08; Iterator &#xff09;进行遍历 2.2 使用增强型 for 循环进行遍历 2.3 使用 Java 8的 Stream API 进行遍历&#xff08;使…

线程安全之锁的原理

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…

思维模型 鸟笼效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。 1 鸟笼效应的应用 1.1 购物中的鸟笼效应 1 漂亮鞋子的故事 假设一个人在商场看到一双漂亮的鞋子&#xff0c;并冲动地购买了它们。当他回到家后&#xff0c;他发现这双鞋子并不适合他的…

【QT】QListWidget

新建项目 list widget&#xff0c;做了布局 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// listWidget的使用&#xff0c;基于itemQListWidgetItem* item …

【电子通识】USB发展历史

USB接口自1994年推出以来&#xff0c;经过29年的发展&#xff0c;经过USB1.0/1.1、USB2.0、USB3.x&#xff0c;发展到了现在的USB4&#xff1b;传输速率也从最开始的1.5Mbps&#xff0c;大幅提高到了最新的40Gbps。 USB1.0 1996年1月15日推出USB1.0接口规范规定低速传输速率为…

数字孪生软件架构选BS还是CS?不,我们选择CSaaS!

BS&#xff08;Browser/Server&#xff09;和CS&#xff08;Client/Server&#xff09;是两种不同的软件架构模式&#xff0c;具有不同的特点和优缺点。 BS&#xff08;Browser/Server&#xff09;架构 BS架构指的是基于浏览器和服务器的软件架构&#xff0c;客户端通常是一个…

1814_ChibiOS中的时间以及时间间隔处理

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 时间的相关配置&#xff0c;有tick的计数精度、时钟频率、间隔时间精度、时间类型大小等不同的配置。这些参数&#xff0c;涉及到系统的时间计数…

JVMGC复习

TLAB:默认给每一个线程开辟一块内存空间存放线程自己的对象 Class对象是存放在堆区的&#xff0c;不是方法区&#xff0c;类的元数据元数据并不是类的Class对象&#xff0c;Class对象是加载的最终产品&#xff0c;类的方法代码&#xff0c;变量名&#xff0c;方法名&#xff0c…

解决windows中被占端口问题(实测有效)

1、用管理员身份打开cmd 2、输入命令查找所被占的端口号 例&#xff1a;8902 netstat -ano | findstr 8902终结被占端口号的进程 例&#xff1a;端口号为8080&#xff0c;则查找到的pid为18524 taskkill /t /f /pid 18524强制&#xff08;/F参数&#xff09; 子进程&#x…

小公司如何成功申请企业邮箱

对于小公司来说拥有专业的企业邮箱不仅有助于提升公司形象&#xff0c;还能有效提高工作效率。小公司怎么申请企业邮箱&#xff1f;以下是一些步骤和建议供您参考。 需要明确公司的需求。 这包括确定所需用户账户的数量&#xff08;一般是目前使用人数再加上几个备用的邮箱&…

Docker入门到精通教程

Docker是什么 Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言并遵从Apache2.0协议开源。容器技术是和我们的宿主机共享硬件资源及操作系统&#xff0c;实现资源的动态分配&#xff0c;在资源受到隔离的进程中运行应用程序及其依赖关系。 Docker可帮助更快地打包、测…