赞
踩
《数据结构》实验报告 程序名: 病人就医管理 一、上机实验的问题和要求: 编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队的过程中,主要发生两件事。 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.在找就诊操作的时候发现有的指针指向有问题,已经删除了的指针被指向了,但是在运行的时候没有发现这里的错误。 六、对算法的时间和空间复杂度进行分析并提出改进设想。 七、对实验方式、组织、设备、题目的意见和建议:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。