c: Queue Calling in Ubuntu

/**
 * @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 
#include 
 
 
//循环队列
#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 ([email protected])
 * @brief 
 * @version 0.1
 * @date 2023-10-20
 * 
 * @copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants
 * 
 */
#include 
#include 
#include 
#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 
#include 
#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 
#include 
#include 
#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
#include
#include
#include
#include
#include
#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;
}

输出:

c: Queue Calling in Ubuntu_第1张图片

你可能感兴趣的:(C,C++,c语言,ubuntu,算法)