如何遍历链表元素

时间:2016-10-31 07:49:34

标签: c++ templates linked-list

我正在尝试解决数据结构类的作业问题。我们应该列出医院患者名单,每个患者都有姓名,年龄,性别和访问清单。每次访问都有约会和医生。

该计划应该能够添加新患者,然后通过输入患者姓名单独地将新访问添加到患者的记录中(该问题假设每个患者的姓名都是唯一的)。该计划还应该能够删除患者,删除访问,按姓名搜索患者,医生搜索访问,并显示所有患者数据。

对于链表,我们应该使用节点类(不允许使用现有数据结构)创建我们自己的线性单链表。我的完整代码如下:

#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)
...

如何遍历链表中的每位患者,以便我可以访问他们的名字?

1 个答案:

答案 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;
}