我正在尝试解决数据结构类的作业问题。我们应该列出医院患者名单,每个患者都有姓名,年龄,性别和访问清单。每次访问都有约会和医生。
该计划应该能够添加新患者,然后通过输入患者姓名单独地将新访问添加到患者的记录中(该问题假设每个患者的姓名都是唯一的)。该计划还应该能够删除患者,删除访问,按姓名搜索患者,医生搜索访问,并显示所有患者数据。
对于链表,我们应该使用节点类(不允许使用现有数据结构)创建我们自己的线性单链表。我的完整代码如下:
#include<iostream>
using namespace std;
template<class T>
class node
{
public:
T data;
node<T> *link;
};
template<class T>
class list
{
private:
node<T> *first;
public:
list()
{
first=NULL;
}
~list()
{
node<T> *next;
while(first)
{
next=first->link;
delete first;
first=next;
}
}
void insertion(T insert)
{
node<T> *cur,*ptr;
ptr=first;
cur=new node<T>;
cur->data=insert;
//cur->link=NULL;
cur->link=first;
first=cur;
}
void display()
{
node<T> *ptr;
if(first==NULL)
{
cout<<"List is empty"<<endl;
}
else
{
ptr=first;
while(ptr!=NULL)
{
cout<<ptr->data<<endl<<endl;
ptr=ptr->link;
}
}
}
};
class visit
{
private:
char date[100];
char doctor[100];
bool filled;
public:
healthrecord()
{
filled=false;
}
void FillVisit()
{
char temp[100];
cout<<"Enter date: ";
cin>>temp;
strcpy(date,temp);
fflush(stdin);
cout<<"Enter doctor: ";
cin>>temp;
strcpy(doctor,temp);
fflush(stdin);
filled=true;
}
void PrintVisit()
{
if(filled)
{
cout<<"PATIENT VISIT"<<endl;
cout<<"Date: "<<date<<endl;
cout<<"Doctor: "<<illness<<endl<<endl;
}
}
char*GetDoctorName()
{
return doctor;
}
};
ostream& operator<<(ostream& os,visit &object)
{
object.PrintVisit();
os<<"";
return os;
}
class patient
{
private:
char name[100];
int age;
char gender[100];
list<visit> visits;
public:
patient(){}
void FillPatientRecords()
{
char temp[100];
int tmp;
cout<<"Enter patient's name: ";
cin>>temp;
strcpy(name,temp);
fflush(stdin);
cout<<"Enter patient's age: ";
cin>>tmp;
age=tmp;
fflush(stdin);
cout<<"Enter patient's gender: ";
cin>>temp;
strcpy(gender,temp);
fflush(stdin);
}
void PrintPatientRecords()
{
cout<<endl<<"Name: "<<name<<endl;
cout<<"Age: "<<age<<endl;
cout<<"Gender: "<<gender<<endl;
healthrecords.display();
}
char*GetPatientName()
{
return name;
}
void AddVisit()
{
healthrecord temp;
temp.FillHealthRecord();
healthrecords.insertion(temp);
}
};
ostream& operator<<(ostream& os,patient &object)
{
object.PrintPatientRecords();
os<<"";
return os;
}
int main()
{
list<patient> patients;
char src[100];
int ch=0;
while(ch!=8)
{
cout<<".:Menu:."<<endl<<"1. Add new patient"<<endl<<"2. Add new visit"<<endl<<"3. Delete a visit"<<endl<<"4. Delete a patient"<<endl;
cout<<"5. Display all patients"<<endl<<"6. Search patients"<<endl<<"7. Search visit"<<endl<<"8. Exit"<<endl<<"Enter a choice: ";
cin>>ch;
if(ch==1)
{
//add patient data
patient temp;
temp.FillPatientRecords();
patients.insertion(temp);
}
else if(ch==2)
{
//add new visit
cout<<"Enter patient's name: ";
cin>>src;
patient temp;
}
else if(ch==3)
{
//delete a visit
cout<<"Enter patient's name: ";
cin>>src;
}
else if(ch==4)
{
//delete a patient
cout<<"Enter patient's name: ";
cin>>src;
}
else if(ch==5)
{
//display all patients
patients.display();
}
else if(ch==6)
{
//search patients
cout<<"Enter patient's name: ";
cin>>src;
}
else if(ch==7)
{
//search visits (print all matching ones)
cout<<"Enter doctor's name: ";
cin>>src;
}
cout<<endl;
}
return 0;
}
如果我所做的只是添加新患者,这样就可以了。但是,我不知道如何为患者添加新的访问,因为我将不得不搜索患者的姓名并为该患者添加新访问。我想到的搜索方法是遍历main()列表中的每个患者,然后将其与搜索查询进行比较,如下所示:
patient temp=(element of linked list)
if(temp.GetPatientName()==src)
...
如何遍历链表中的每位患者,以便我可以访问他们的名字?
答案 0 :(得分:0)
由于您的代码代表,您无法更改患者的访问次数,因为访问列表是patient
类的私有成员。如果它是公开的,那么你可以做类似
list<visit> &visits = patients.front().visits
visits.push_back(/* some new visit */);
在此之后,将访问列表公开可能很诱人。但请注意,这在OOP中被认为是不好的样式(和功能)。相反,你应该写mutator methods。也就是说,在patient
类中提供一个公共方法,该方法将数据和医生作为参数,并在其中创建新访问并将其附加到您称之为患者的访问列表中。类似下面的addVisit(..)
方法。同样,如果您希望人们能够访问患者的姓名,您可以编写一个公共getName()
方法,该方法将返回患者姓名:
class patient
{
public:
void addVisit(string date, string doctor) {
visit v(date, doctor);
visits.push_back(v);
}
string getName() { // public method used to get name
return name;
}
private:
string name;
int age;
string gender;
list<visit> visits;
...
因此,例如,您可以这样做:
int main() {
list<patient> patients;
// ... populate patients list
patient &curr = patients.front(); // say you want to add a visit for the first patient in the list
curr.addVisit("25 Sep", "Dr. Harambe");
}
我可能在这里弄乱了一些语法和其他东西(一半是在手机上写的),但它的要点才是最重要的。
要遍历列表,请编写一个返回列表前面的方法并使用它:
node *curr = patients.getFront();
while(curr != NULL) {
if(curr.getName() == src) {
//... do stuff
curr = curr->link;
}