基本上我需要帮助的是初始化我的find_person和print_person方法以在main.Right中运行。现在当我运行程序时,除了主要的cout和cin之外没有任何事情发生。如果不是完全正确的话,这些方法非常接近(如果它们不是请让我知道)(fyi,州和人信息来自同一个文件,我只是获取人物对象的所有信息,只是状态字符串输出对于州对象。)任何帮助将不胜感激谢谢。
#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;
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;} }
}
Link<person> * find_person(string Fname, string Lname)//finds person based on user input
{
Link<person>* first;
Link<person> * temp = first;
while (temp != NULL)
{
if (temp->data->fname==Fname && temp->data->lname==Lname )
{
return temp;
}
temp = temp->next;
}
return NULL;
}
void print_person(Link<person> * printP)//prints person and all info
{
if (printP == NULL)
cout << "No people match search\n\n";
else
{
cout << "SEARCH RESULTS FOR PERSON: \n" << "First Name: " << printP->data->fname <<
"\n Last Name: " << printP->data->lname <<
"\n Birthday: " << printP->data->dob <<
"\n Social Security #: " << printP->data->ss_number <<
"\n State of Residence: "<< printP->data->state<<"\n\n";
}
}
};
List<person>*person_from_file(string file)//reads file of people
{
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 of states
{
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");
cout<<"Search for Person: ";
string f,l;
cin>>f>>l;
Link<person> *x=A->find_person(f,l);
A->print_person(x);
return 0;
}
答案 0 :(得分:1)
代码肯定不正确。以下是我发现的一些事情(列表不太可能完整):
List
构造函数在我能想到的几乎所有方面都被误导了:
建议:不将链接作为参数,并始终将列表初始化为空!或者,将仅作为参数,并通过遍历列表来确定尾部。
List
似乎创建节点,即它必须拥有元素。如果是这样,它显然需要一个析构函数释放它们,复制构造函数和复制赋值来复制列表(或者可以删除它们以禁止复制列表)。List
的不变量应该是,如果设置head
,tail
指向List
中的最后一个元素。如果是这样,您只需要测试Head
或tail
(顺便说一句,您应该一致地命名您的成员,可能是head
和tail
) add()
函数从未设置Head
。这显然是错误的。newlink
)应该通过公共代码完成:只有在检查条件后才需要创建代码。所有需要有条件的是如何建立事物。使用一个常见技巧(即指向尾节点而不是尾节点的指针tail
)完全删除条件!first
中的find_person()
未初始化。因此,代码是未定义的。无论发生什么事。person
对象在哪里发布?换句话说:该程序充满了内存泄漏。