链接列表操作C ++

时间:2015-04-14 19:00:53

标签: c++ class templates linked-list

我有一个链接列表数据库,使用模板编译得很好,让我打印出所有状态列表,让我搜索一个人并打印所有人员数据(因为这些方法有效,我把它们排除了以下节省空间。)

下面我有print_people_in_state方法,我需要做的是(给定用户输入状态)打印出来自该特定状态的所有人的信息。但是现在当我运行它时,没有任何反应。我该如何解决这个问题?

如果您想自己运行代码,请输入我命名为data.txt(http://rabbit.eng.miami.edu/class/een118/labs/152/dbfile1.txt)的文件

#include <iostream>
#include <string>
#include <string.h>
#include <fstream>
using namespace std;


struct person
{
    int dob,ss_number;
    string fname, lname,state;

    person()
    { }
    person(int a, int b, string c, string d, string e)
    {dob=a; ss_number=b; fname=c; lname=d; state=e;}
};


struct state
{
    string sname;
    person*P;


    state()
    {}
    state(string a)
    {sname=a;}
};

template<typename T>struct Link
{
    T*data;
    Link*extradata;
    Link*next;

    Link()
    {}
    Link(T*a,Link<T>*C=NULL)
    {
        data=a;
        next=C;

    }

};
template<typename T>
struct List
{int length;
    Link<T>*Head,*tail;
    List(Link<T>*h=NULL, Link<T>*t=NULL)
    {
        Head=h;
        tail=t;
        length=0;
    }

    void add(T*object)
    {
        {   if (Head == NULL && tail == NULL)
        {   Link<T> * newlink = new Link<T>(object);
            Head = newlink;
            tail = Head;  }
        else
        {   Link<T> * newlink = new Link<T>(object);
            tail->next = newlink;
            tail=newlink;} }
    }
void print_people_in_state(string search)
{

   Link<state>*temp=Head;
   if(temp!==NULL)
       {
          if(temp->data->P->state==search)
             {
               cout<<temp->data->P->fname<<endl;
              }
       //  temp=temp->next;
}}




};
List<person>*person_from_file(string file)//reads file 
{
    List<person>* newlist=new List<person>();
    //        Link<T> * head=NULL;
    //        Link<T> * temp=NULL;
    ifstream fin;
    fin.open("data.txt");
    if (fin.fail())
        cout<<"file not found\n";
    if (!fin.fail())
    {
        while(true)
        {
            int a,b;
            string c,d,e;
            fin>>a>>b>>c>>d>>e;
            if (fin.fail())break;
            person * p=new person(a,b,c,d,e);
            newlist->add(p);


        }
    }
    else
        cout<<"Can't open file";
    fin.close();
    return newlist;
}
List<state>*state_from_file(string file)//reads file 
{
    List<state>* newlist=new List<state>();
    //        Link<T> * head=NULL;
    //        Link<T> * temp=NULL;
    ifstream fin;
    fin.open("data.txt");
    if (fin.fail())
        cout<<"file not found\n";
    if (!fin.fail())
    {
        while(true)
        {
            int a,b;
            string c,d,e;
            fin>>a>>b>>c>>d>>e;
            if (fin.fail())break;
            state * s=new state(e);
            newlist->add(s);


        }
    }
    else
        cout<<"Can't open file";
    fin.close();
    return newlist;
}

int main()
{List<person>*A = person_from_file("data.txt");
 List<state> *B= state_from_file("data.txt");



       B->print_people_in_state("TX");



    return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以简化LinkList。您可以读取文件一次并同时填充两个列表。事实上,你并不需要一个单独的状态列表,它的用法令人困惑。

template<typename T>class Link
{
public:
    Link(T *data) { Data = data; Next = NULL; }
    T *Data;
    Link<T> *Next;
};

template<typename T>struct List
{
    int Count;
    Link<T> *Head, *Tail;
    List() { Head = NULL; Tail = NULL; Count = 0; }

    Link<T>* AddData(T *data)
    {
        Link<T> *node = new Link<T>(data);
        Count++;
        if (Head == NULL)
        {
            Head = Tail = node;
        }
        else
        {
            Tail->Next = node;
            Tail = node;
        }
        return node;
    }
};

int main()
{
    List<person> *list = new List<person>;

    ifstream fin("data.txt");
    while (fin)
    {
        int a, b;
        string c, d, e;
        fin >> a >> b >> c >> d >> e;
        list->AddData(new person(a, b, c, d, e));
    }

    Link<person> *node = list->Head;
    while (node)
    {
        if (node->Data->state == "TX")
            cout << node->Data->fname << endl;
        node = node->Next;
    }

    return 0;
}