队列的应用之简单的医院就诊系统(多文件的基本要点)

一.多文件的基本要点

多文件结构便于代码的解读与改进

  1. 文件一般分为

(.h)文件一般包括函数的定义与声明。

(.cpp)函数的主要内容。

(main)主要体现函数的作用,对于函数的调用。

2.(.cpp)文件对于(.h)函数的调用需要在(.cpp)文件头加上#include"LinkQueue.h"(双引号中为.h函数的函数名)。

3.对于复杂的多文件,往往是多个份文件,为了防止头文件的重复定义与冲突则需要采用

前两句在(.h)文件头,后一句为文件尾。

其中前两句语言后部代码为该文件文件名的大写形式。

二.简单的医院的就诊系统

主要包括候诊,就诊,查看排队情况(输入病历号查看之前候诊人数),查看看诊(是否有人候诊)。其中能够引用队列的基本知识,候诊为入队,就诊为出队。

1.结构的定义(与队列有一些不同)

主要差别在于队列中数据类型为int,此时数据类型为结构体

typedef struct
{
    char str[20];
    int num;
}ElemType;

指针结构体多定义一个int zong以记录就诊总人数。

typedef struct
{
	int Qzong;
    Queue front;
    Queue rear;
}LinkQueue;

候诊,就诊与上一个队列中的要点相同可查看上一个文章。

2.查看排队情况

定义一个指针指向节点,定义i=0.

采用while循环当当节点数据域的病历号与所输入病历号不同时i++,指针向后移动。

i则为之前人数,在采用循环输出名称病历号。

status search(LinkQueue &Q,ElemType &e,int num)
{
	if(Q.front==Q.rear)  return ERROR;
	QNode *p;
	p=Q.front->next;
	int i=0;
	while(p->data.num!=num)
	{
		i++;
		p=p->next; 
	}
	cout<<"之前还有"<<i<<"人候诊"<<endl;
	p=Q.front->next;
	for(i;i>0;i--)
	{
		cout<<"姓名:"<<p->data.str<<endl;
		cout<<"病历号:"<<p->data.num<<endl;
		p=p->next; 
	}
	return OK;
}

3.剩余人数

定义一个指针指向头指针,定义i=0.

采用while循环,当P不等于Q.real(尾指针)时即还在候诊,令i++,p向后移动。

status renshu(LinkQueue Q)
{
	if(Q.rear==Q.front)  return ERROR; 
	int i=0;
	QNode *p;
	p=Q.front;
	while(p!=Q.rear)
	{
		i++;
		p=p->next;
	}
	cout<<"还有"<<i<<"个人候诊"<<endl;
	return OK;
}

总函数:(分为多文件形式)

以下文件名依次为:LinkQueue.h  LinkQueue.cpp function.h  function.cpp   main1.cpp

#include"LinkQueue.h"
status InitQueue(LinkQueue &Q)
{
	Q.Qzong=0;
    QNode *p=new QNode;
    Q.front=Q.rear=p;
    Q.front->next=NULL;
    return OK;
}
status push(LinkQueue &Q,ElemType e)
{
	QNode *p;
	p=new QNode;
	if(!p) return ERROR;
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	Q.Qzong++;
	return OK;
}
status pop(LinkQueue &Q,ElemType &e)
{
	QNode *p;
	if(Q.rear==Q.front) return ERROR;
	p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	if(Q.rear==p) Q.rear=Q.front;
	delete p;
	return OK;
}
status Get(LinkQueue &Q,ElemType &e)
{
	if(Q.rear==Q.front) return ERROR;
	e=(Q.front->next)->data;
	return OK;
}
status search(LinkQueue &Q,ElemType &e,int num)
{
	if(Q.front==Q.rear)  return ERROR;
	QNode *p;
	p=Q.front->next;
	int i=0;
	while(p->data.num!=num)
	{
		i++;
		p=p->next; 
	}
	cout<<"之前还有"<<i<<"人候诊"<<endl;
	p=Q.front->next;
	for(i;i>0;i--)
	{
		cout<<"姓名:"<<p->data.str<<endl;
		cout<<"病历号:"<<p->data.num<<endl;
		p=p->next; 
	}
	return OK;
}
status renshu(LinkQueue Q)
{
	if(Q.rear==Q.front)  return ERROR; 
	int i=0;
	QNode *p;
	p=Q.front;
	while(p!=Q.rear)
	{
		i++;
		p=p->next;
	}
	cout<<"还有"<<i<<"个人候诊"<<endl;
	return OK;
}
void show(ElemType e)
{
	cout<<"病历号:"<<e.num<<endl;
	cout<<"姓名:"<<e.str<<endl;
}
#ifndef FUNCTION_H
#define FUNCTION_H
#include"LinkQueue.h"
#include<stdlib.h>
status shangban(LinkQueue &Q,int &flat);
void houzhen(LinkQueue &Q);
void jiuzhen(LinkQueue &Q);
void chakan(LinkQueue Q);
void xiaban(LinkQueue &Q);
void menu();
#endif
#include"function.h"
status shangban(LinkQueue &Q,int &flat)
{
	if(InitQueue(Q)==OK)
	{
		cout<<"准备成功"<<endl;
		flat=1;
	}
	else cout<<"准备失败"<<endl;
}
void houzhen(LinkQueue &Q)
{
	ElemType e;
	cout<<"输入病历号:";
	cin>>e.num;
	cout<<"输入姓名:";
	cin>>e.str;
	if(push(Q,e)==OK) cout<<"挂号成功"<<endl;
	else cout<<"挂号失败"; 
}
void jiuzhen(LinkQueue &Q)
{
	if(Q.front==Q.rear) cout<<"暂时无人候诊"<<endl;
	ElemType e;
	if(pop(Q,e)==OK) 
	{
		cout<<"成功"<<endl;
		show(e);
	}
}
void chakan(LinkQueue Q)
{
	ElemType e;
	int num;
	cout<<"输入病历号:";
	cin>>num;
	if(search(Q,e,num)==ERROR) cout<<"暂无人就诊"<<endl; 
}
void xiaban(LinkQueue &Q)
{
	cout<<"今日总就诊人数为:"<<Q.Qzong<<endl;
}
void menu()
{
	int flat=0;
	LinkQueue Q;
	int choice;
	while(1)
	{
		cout<<"1.上班            2.候诊               3.就诊  "<<endl;
		cout<<"4.查看排队情况    5.查看是否有人候诊   6.下班  "<<endl;
		cout<<"请输入操作序号:";
		cin>>choice;
		switch(choice)
		{
			case 1:
				shangban(Q,flat);
				break;
			case 2:
				if(flat==0)cout<<"医生未上班"<<endl;
				else houzhen(Q);
				break;
			case 3:
				if(flat==0)cout<<"医生未上班"<<endl;
				else jiuzhen(Q);
				break;
			case 4:
				if(flat==0)cout<<"医生未上班"<<endl;
				else chakan(Q);
				break;
			case 5:
				if(flat==0)cout<<"医生未上班"<<endl;
				else renshu(Q);
				break;
			case 6:
				if(flat==0)cout<<"医生未上班"<<endl;
				else xiaban(Q);
				break;
			default :
			cout<<"序号不合法,请重新选择"<<endl;				
		} 
		system("pause");
		system("cls");
	}
}
#include"function.h"
int main()
{
	menu();
	return 0;
}

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值