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