2016-10-31 6 views
0

Я пытаюсь решить проблему домашнего задания для моей структуры данных класса. Мы должны составить список больничных пациентов, у каждого пациента есть имя, возраст, пол и список посещений. У каждого визита есть свидание и врач.Как перебрать связанные элементы списка

Программа должна иметь возможность добавлять новых пациентов, а затем отдельно добавлять новые визиты в запись пациента, введя имя пациента (проблема предполагает, что имена каждого пациента уникальны). Программа также должна иметь возможность удалять пациентов, удалять посещения, искать пациентов по имени, искать врачи и отображать все данные пациентов.

Для связанного списка, мы должны сделать наш собственный линейный односвязный список с классом узла (не допускается использование существующих структур данных). Мой полный код:

#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; 
} 

Это работает отлично, если все, что я сделал, это добавить новых пациентов. Однако я не знаю, как добавлять новые визиты к пациенту, так как мне придется искать имя пациента и добавлять новый визит к этому пациенту. Метод поиска Я имею в виде, чтобы перебирать каждый пациент в списке в основном(), а затем сравнить его с поисковым запросом так:

patient temp=(element of linked list) 
if(temp.GetPatientName()==src) 
... 

Как перебирать каждый пациент в связанном списке так Я могу получить доступ к их именам?

+1

Не зная остальную часть мяса в вашем шаблон 'list' (очень плохой выбор имен там, кстати, особенно если вы использовали' using namespace std; ', [который вы не должны делать] (https://stackoverflow.com/questions/1452721/why-is- используя-namespace-std-рассмотренную-плохую практику), но, по-видимому, есть), мы должны предположить, что вы предоставили способ ссылаться на пациента (singluar) в списке пациентов по результатам вашего поиска. Учитывая эту рекомендацию, управление/доступ к списку посещений этого пациента должно быть достигнуто с помощью методов, выявленных в вашем классе пациентов. Короче говоря, вы должны закодировать его в конце концов. – WhozCraig

+0

@WhozCraig Вы могли бы использовать немного меньше sass в своем ответе; некоторые люди новы к программированию. – gowrath

+0

@WhozCraig Но есть улов: для поиска пациента по имени мне кажется, что мне нужно получить доступ к имени каждого пациента из объекта списка в main(), а затем сравнить его с поисковым запросом пользователя, чтобы найти матч. Как получить доступ к имени каждого пациента из объекта списка? – Penny

ответ

0

Поскольку ваш код стоит, вы не можете изменять визиты для пациента, потому что список посещений является частным членом класса patient. Если бы это было публично, то вы могли бы сделать что-то вроде

list<visit> &visits = patients.front().visits 
visits.push_back(/* some new visit */); 

После этого, он может быть заманчиво просто сделать список посещения общественности. Однако обратите внимание, что это считается плохим стилем (и функциональностью) в ООП. Вместо этого вы должны написать 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; 
} 
Смежные вопросы