《数据结构》实验报告
程序名: 病人就医管理
一、上机实验的问题和要求:
编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队的过程中,主要发生两件事。
1、病人到达诊室,将病历交给护士,排到等待队列中候诊。
2、护士从等待队列中取出一名病人的病历,该病人进入诊室就诊。
要求程序采用菜单方式,其选项及功能说明如下。
候诊——输入病人的病历号和姓名,将该病人加入队列中。
就诊——队列中排最前面的病人就诊,并将其从队列中删除。
查询——输出前面需要等的人数。
退出——退出运行。
3、将实验报告以自己的学号和姓名命名,提交到教学平台和FTP上。
二、程序设计的基本思想,原理和算法描述:
(分析问题中的数据及数据元素之间的关系,确定选择何种逻辑结构;再根据操作特点分析选择何种存储结构,最后再具体分析每个功能,看需要用到哪些基本操作,如何用基本操作组合出该功能。)
数据元素为病历号和姓名。选用链队。候诊是插入功能,就诊是删除功能和判断链队是否为空功能,查询是遍历功能加上计数,退出结束运行。做一个目录用swtich语句让用户进行操作选择。
三、源程序及注释:
#pragma once
#ifndef LinkQueue.h
#define LinkQueue.h
struct Node
{
int data;
string name;
Node* next;
};
class LinkQueue
{ public:
LinkQueue();
~LinkQueue();
void InQueue(int, string);
void OutQueue();
int GetQueue();
int Empty();
private:
Node* front, * rear;
};
#endif
#pragma once
#ifndef patient.h
#define patient.h
#include"LinkQueue.h" //链队列
class Patient
{
private:
LinkQueue queue;
public:
//方法声明及重载编译系统默认方法声明
Patient() {}; //无参数的构造函数
~Patient() {}; //析构函数
};
#endif
#include "iostream"
using namespace std;
#include "LinkQueue.h"
LinkQueue::LinkQueue()
{
Node* s = NULL;
s = new Node;
s->next = NULL;
front = rear = s;
}
LinkQueue::~LinkQueue()
{
Node * p = NULL;
while (front != NULL)
{
p = front->next;
delete front;
front = p;
}
}
void LinkQueue::InQueue(int num, string n)
{
Node* s = NULL;
s = new Node;
s->data = num;
s->name = n;
s->next = NULL;
rear->next = s;rear = s;
}
void LinkQueue::OutQueue()
{
Node* p = NULL;
int num1=0;
if (rear == front)
{
cout << "下溢" << endl;
return;
}
p=front->next;
num1 = p->data;
front->next = p->next;
if (p->next == NULL)
{
cout << "只有一个" << endl;rear = front;
}
delete p;
cout << num1 << "号病人现在就医." << endl;
}
int LinkQueue::GetQueue()
{
int count = 0;
if (front == rear) return 0;
Node* temp = front->next;
cout << temp->name << endl;
while ( temp != NULL)
{
cout << temp->name << endl;
count++;
temp = temp->next;
}cout<< count<<endl;
return count;
}
int LinkQueue::Empty()
{
if (front == rear)
return 1;
else return 0;
}
#include"Patient.cpp"
#include"LinkQueue.h"
void StandInALine(LinkQueue &queue)
//操作结果:输入病人的病历号和姓名,加入到病人排队队列中
{
string name;
int num; //病历号
cout << "请输入病历号和姓名:";
cin >> num; //输入病人的病历号
cin >> name;//输入姓名
queue.InQueue(num, name); //将病历号加入到病人排队队列中
}
void Cure(LinkQueue& queue)
//操作结果:病人排队队列中最前面的病人就诊,将其从队列中删除
{
//cout << queue.GetQueue() << endl;
if (queue.Empty())
{ //无病人
cout << "现已没有病人在排队了!" << endl;
}
else
{
queue.OutQueue(); //病人排队队列中最前面的病人就诊,并将其从队列中删除
}
cout << queue.GetQueue() << endl;
}
void Print(LinkQueue& queue)
//操作结果:输出前面需要等的人数。
{
queue.GetQueue(); //输出前面需要等的人数。
cout << endl;
}
int main()
{ int select = 0;
LinkQueue q;
while (select != 4)
{
cout << "1.候诊—输入排队病人的病历号,加入到病人队列中." << endl;
cout << "2.就诊—病人排队队列中最前面的病人就诊,并将其从队列中删除" << endl;
cout << "3.查询—输出前面需要等的人数" << endl;
cout << "4.退出—退出运行" << endl;
cout << "请选择:";
cin >> select; //选择功能
switch (select)
{
case 1:
StandInALine(q); //候诊——输入病人的病历号,加入到病人队列中
break;
case 2:
Cure(q); //就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除
break;
case 3:
Print(q); //查询——输出前面需要等的人数
break;
default:cout << "输入错误" << endl;
}
}
}
四、运行输出结果:
四、调试和运行程序过程中产生的问题及采取的措施,吸取的经验教训:
问题1.就诊操作时最后实现出现错误,后来发现是条件错了,最后一个病人时front=rear了,但是写条件时下面的操作都是基于front与rear不相等来做的。对链队最后一个结点造成了错误,在写程序的时候应该对特殊情况进行考虑。
问题2.name定义了以后没有用起来,后来将代码补充了一下
问题3.操作一开始是写在patient的成员函数里面的,后来直接写为普通函数放在了main函数中
问题4.在找就诊操作的时候发现有的指针指向有问题,已经删除了的指针被指向了,但是在运行的时候没有发现这里的错误。
六、对算法的时间和空间复杂度进行分析并提出改进设想。
七、对实验方式、组织、设备、题目的意见和建议:
数据结构--病人就医管理
最新推荐文章于 2024-05-06 19:34:10 发布