2015-04-14 4 views
-4

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

Ниже у меня есть метод 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; 
} 
+0

Вам придется перебирать связанный список в 'print_people_in_state()', я думаю. – 101010

+3

используйте отладчик. – pm100

+0

Строка 'if (state == search)' вам нужно использовать 'if (state.compare (search)'. Я считаю – jiveturkey

ответ

0

Вы можете упростить Link и List. Вы можете прочитать файл один раз и заполнить оба списка одновременно. На самом деле вам действительно не нужен отдельный список для состояний, его использование запутывает.

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; 
} 
Смежные вопросы