数据结构与算法实验6——队的应用

一、实验目的

队列的应用,结合应用实例,深入理解和掌握队列。

二、实验软硬件要求

1、VC++ 6.0

三、实验预习

队列基本操作

四、实验内容(实验步骤、测试数据等)

1、队列基本操作。请选择循环队列结构或链式队列结构实现队列的基本操作(包括初始化、入队、出队等),并在主函数中进行入队出队等操作,检验算法正确性。(必做)

2、编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队过程中,主要重复两件事:(选做)

(1)病人到达诊室,将病历交给护士,排到等待队列中候诊。

    护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。

要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:

    排队——输入排队病人的病历号,加入到病人排队队列中。
    就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
    查看排队——从队首到队尾列出所有的排队病人的病历号。
    不再排队,余下顺序就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。

(5)下班——退出运行,提示未就诊的病人明天再来。

运行结果:

    实验体会

(可以记录C语言中薄弱的部分,便于课后复习巩固,每次实验体会需要写两行。)

第二个实验的难度较大,本章对于队列的逻辑理解较好,但是C语言基础薄弱,即使知道原理也无法独立写出代码。注意点:队列特点为先进先出,front==rear时表示队列满或空,另设tag,当tag==1时表示满,tag==0时表示空,队列满则返回0

六、源代码或重要代码

实验一

#include <stdio.h>

#include <stdlib.h>

typedef int Elemtype;

//声明一个结构体来表示节点

typedef struct Node

{

     Elemtype data;   //节点数据域

     struct Node * next; //节点指针域

}QueueNode;

//声明一个结构体来定义上面这个结构体的两个指针

typedef struct

{

    QueueNode *front,*rear;//分别指向队首和队尾的指针

}LinkQueue;

//首先进行初始化

void Init(LinkQueue *s)

{

    QueueNode * p;

    p=(QueueNode*)malloc(sizeof(QueueNode));

    p->next=NULL;

    s->front=s->rear=p;

}

//判断队列是否为空,为空返回真1,不为空返回假0

int Empty(LinkQueue s)

{

    //队空的条件是头指针和尾指针指向相同的地方

    if(s.front==s.rear)

    {

        return 1;

    }

    return 0;

}

//求队列长度

int GetLength(LinkQueue s)

{

    //声明一个节点类型的指针

    QueueNode *p;

    //让p指向队列的头指针

    p=s.front;

    //声明一个变量用来记录队列当前长度

    int length=0;

    while(p->next)//当指针p所指的节点不为空时执行循环体

    {

        length++;

        p=p->next;

    }

    return length;//返回当前队列的长度

}

//入队操作

 void Add(LinkQueue *s,Elemtype x)

 {

     //声明一个节点类型的指针变量用来存储要入队的元素

     QueueNode *p;

     p=(QueueNode*)malloc(sizeof(QueueNode));

     if(!p){

        printf("内存分配失败\n\n");

        return;

     }

     p->data=x;        //指针指向的节点的数据域存放x

     p->next=NULL;     //指针指向的节点的指针域置为空

     s->rear->next=p;   //将队列的尾指针的指针域next指向指针p所指的节点

     s->rear=p;         //将队列的尾指针向后移一位,指向刚入队的节点的位置

 }

 //获取队首元素

 Elemtype GetTop(LinkQueue s)

 {

     //首先判断队列是否为空

     if(Empty(s))

     {

         printf("队列为空,无法获取队首元素\n\n");

         return 0;

     }

     return s.front->next->data;//不为空的话就返回队首指针指向的第一个元素的数据域

 }

 //出队操作

 void Del(LinkQueue *s,Elemtype *e)

 {

     //先判断队列是否为空

     if(Empty(*s))

     {

         printf("当前队列为空,无法执行出队操作\n\n");

         return;

     }

     //用临时变量保存出队的元素

     QueueNode *p;

     p=s->front->next;

     if(p==s->rear)

     {

         s->front=s->rear;

     }

     *e=p->data;

     s->front->next=p->next;

     free(p);

 }

int main()

{

    //声明一个节点类型的变量

    Elemtype e;

    //声明一个顺序队名字为s

    LinkQueue s;

    //对这个顺序队进行初始化

    Init(&s);

    printf("==============================================================\n");

    printf("当前队列是否为空,为空返回真1,不为空返回假0:%d\n\n",Empty(s));

    printf("当前队列的长度为:%d\n\n",GetLength(s));

    //执行入队操作

    Add(&s,5);

    Add(&s,4);

    Add(&s,6);

    Add(&s,2);

    printf("==============================================================\n");

    printf("当前队列是否为空,为空返回真1,不为空返回假0:%d\n\n",Empty(s));

    printf("当前队列的长度为:%d\n\n",GetLength(s));

    //获取当前队首元素

    printf("==============================================================\n");

    e=GetTop(s);

    if(e){

        printf("当前队列的队首元素为:%d\n\n",e);

    }

    //执行出队操作

    printf("==============================================================\n");

    Del(&s,&e);

    printf("出队的元素为:%d,当前队列的长度为:%d\n\n",e,GetLength(s));

    //获取当前队首元素

    e=GetTop(s);

    if(e){

        printf("当前队列的队首元素为:%d\n\n",e);

    }

    //再执行一次出队操作

    printf("==============================================================\n");

    Del(&s,&e);

    printf("出队的元素为:%d,当前队列的长度为:%d\n\n",e,GetLength(s));

    //获取当前队首元素

    e=GetTop(s);

    if(e){

        printf("当前队列的队首元素为:%d\n\n",e);

    }

    //再执行一次出队操作

    printf("==============================================================\n");

    Del(&s,&e);

    printf("出队的元素为:%d,当前队列的长度为:%d\n\n",e,GetLength(s));

    //获取当前队首元素

    e=GetTop(s);

    if(e){

        printf("当前队列的队首元素为:%d\n\n",e);

    }

    return 0;

}

实验二

#include <stdio.h>

#include <malloc.h>

//链队结点类型

typedef struct qnode

{

    int data;

    struct qnode *next;

} QNode;            /*链队结点类型*/

 //链队类型

typedef struct

{

    QNode *front,*rear;

} QuType;           /*链队类型*/

 //模仿看病流程函数

void SeeDoctor()

{

    int sel,flag=1,find,no;

    QuType *qu;

    QNode *p,*q;

    qu=(QuType *)malloc(sizeof(QuType));    /*创建空队*/

    qu->front=qu->rear=NULL;

    while (flag==1)                             /*循环执行*/

    {

        printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班  请选择:");

        scanf("%d",&sel);

        switch(sel)

        {

        case 1:

            printf("  >>输入病历号:");

            do

            {

                scanf("%d",&no);

                find=0;

                p=qu->front;

                while (p!=NULL && !find)

                {

                    if (p->data==no)

                        find=1;

                    else

                        p=p->next;

                }

                if (find)

                    printf("  >>输入的病历号重复,重新输入:");

            }

            while (find==1);

            p=(QNode *)malloc(sizeof(QNode));   /*创建结点*/

            p->data=no;

            p->next=NULL;

            if (qu->rear==NULL)                 /*第一个病人排队*/

            {

                qu->front=qu->rear=p;

            }

            else

            {

                qu->rear->next=p;

                qu->rear=p; /*将*p结点入队*/

            }

            break;

        case 2:

            if (qu->front==NULL)                /*队空*/

                printf("  >>没有排队的病人!\n");

            else                                /*队不空*/

            {

                p=qu->front;

                printf("  >>病人%d就诊\n",p->data);

                if (qu->rear==p)            /*只有一个病人排队的情况*/

                {

                    qu->front=qu->rear=NULL;

                }

                else

                    qu->front=p->next;

                free(p);

            }

            break;

        case 3:

            if (qu->front==NULL)            /*队空*/

                printf("  >>没有排列的病人!\n");

            else                            /*队不空*/

            {

                p=qu->front;

                printf("  >>排队病人:");

                while (p!=NULL)

                {

                    printf("%d ",p->data);

                    p=p->next;

                }

                printf("\n");

            }

            break;

        case 4:

            if (qu->front==NULL)            /*队空*/

                printf("  >>没有排列的病人!\n");

            else                            /*队不空*/

            {

                p=qu->front;

                printf("  >>病人按以下顺序就诊:");

                while (p!=NULL)

                {

                    printf("%d ",p->data);

                    p=p->next;

                }

                printf("\n");

            }

            flag=0;                         /*退出*/

            break;

        case 5:

            if (qu->front!=NULL)            /*队不空*/

                printf("  >>请排队的病人明天就医!\n");

            flag=0;                     /*退出*/

            break;

        }

    }

    p=qu->front;  //销毁队列

    while (p!=NULL)

    {

        q = p->next;

        free(p);

        p = q;

    }

}

 //主函数

int main()

{

    SeeDoctor();//调用病人看病函数

    return 0;

}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx | nginx反向代理/负载均衡/缓存

文章目录 一、Nginx 反向代理1.1 nginx 文件结构1.2 默认的nginx配置文件1.3 实践中的 nginx.conf 二、Nginx 负载均衡2.1 热备负载均衡2.2 轮询负责均衡2.3 加权轮询负载规则2.4 ip_hash 负载均衡2.5 对特定资源实现负载均衡2.6 对不同域名实现负载均衡2.7 实现带有URL重写的负…

Java NIO是New IO还是Non-blocking IO

文章目录 前言NIO到底叫啥通过对比理解NIO传统IO网络编程NIO引入的新概念NIO网络编程两者区别NIO的事件驱动 总结 前言 很多小伙伴对Java NIO的一些概念和编程不是很理解&#xff0c;希望通过本文对Java NIO与传统IO的对比&#xff0c;可以帮助大家更好地理解和掌握Java NIO。…

从学习海底捞到学习巴奴,中国餐饮带洋快餐重归“产品主义”

俗话说“民以食为天”&#xff0c;吃饭一向是国人的头等大事&#xff0c;餐饮业也是经济的强劲助推力。新世纪以来&#xff0c;餐饮业不断讲述着热辣滚烫的商业故事。 2006年&#xff0c;拥有“必胜客”、“肯德基”等品牌的餐饮巨头百胜集团&#xff0c;组织两百多名区域经理…

【洛谷】P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目链接 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 这道题可以用数学的方法去做&#xff0c;但是我想不到&#x1f607;有兴趣的可以去看看数学的题解 比较简单的思路就是二分查找&#xff0c;轻松简单不费脑&#xff0c;带你…

Claude 3 on Amazon Bedrock 结合多智能体助力 Altrubook AI 定义消费者 AI 新范式

关于 Altrubook AI 智能消费决策机器人 Altrubook 是全球首创场景化智能决策机器人&#xff0c;由国内外大厂等前员工共同研发&#xff0c;具有定制化 IP 决策机器人、沉浸式购物体验和需求匹配优化等独特优势。目前&#xff0c;Altrubook AI 已完成与 Claude 3 on Amazon Bedr…

STM32H5 读取温度传感器校准值时进 HardFault 的原因分析

1.前言 有客户反馈&#xff0c;在使用 STM32H5 读取温度传感器校准值地址时&#xff0c;会进入 HardFault&#xff0c;而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题&#xff0c;发现只有开启 ICACHE 后才会复现&#xff0c;初步验证…

ZCMU操作系统课程实验 - 实验1-Linux的使用

登录 1. 打开这个东西 2. 在 文件 - > 打开 中打卡机房里VMOS文件里的这个东东 3. 然后依次操作下去好了&#xff0c;有红色的选项&#xff0c;我都是选的"Do nothing"。完成后就会出现这样一个黑框框。 4. 让你登录。输入&#xff1a;root。密码&…

正则表达式浅析

正则表达式&#xff0c;又称正规表示法、常规表示法&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”&#xff0c;可以保护表格不被他人随意打开&#xff0c;那如果后续不需要保护了&#xff0c;不想每次打开Excel都需要输密码&#xff0c;要怎么去除“打开密码”呢&#xff1f; 今天分享3个方法&#xff0c;最后一个方法记得收藏起来&#xff0c;以…

有哪些绝美的古诗词呀?

编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 绝美的古诗词是中国古代文化的重要组成部分&#xff0c;它们以优美的语言和深邃的意境&#xff0c;展现了古代人们的生活、情感和思想。以下是一些绝美的古诗词&#xff0c;它们不仅具有文学价值&#xff0c;更…

微功耗轨至轨运算放大器芯片D8541和D8542对比分析

D8541和D8542是芯谷科技推出的两款微功耗轨至轨运算放大器芯片&#xff0c;其中D8541为单运放&#xff0c;D8542为双运放&#xff0c;它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用&#xff0c;在新能源充电桩、智能充电枪、储…

c# 插值搜索-迭代与递归(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组&#xff0c;编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素&#xff0c;跳转搜索需要 O(? n) 时间&#xff0c;二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进&#xff0c;…