基本上,我需要帮助的是初始化我的 find_person 和 print_person 方法以在 main 中工作。现在,当我运行该程序时,除了 main 中的 cout 和 cin 之外,什么也没有发生。这些方法即使不完全正确也非常接近(如果不正确请告诉我)(仅供引用,状态和人员信息来自同一个文件,我只是获取人员对象的所有信息和状态字符串对于状态对象。)任何帮助将不胜感激谢谢。
#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;
}
最佳答案
代码肯定是不正确的。以下是我发现的几件事(列表不太可能完整):
List
构造函数在我能想到的几乎所有方面都被误导了:- 很少有充分的理由不使用成员初始值设定项列表(尽管这是最不重要的问题)。
- 如果给构造函数一个头部和一个尾部,那么长度肯定是错误的。
- 如果给它一个头或一个尾部而不给另一个,会发生什么?这似乎会使列表处于不一致状态(好吧,从您的实现中不清楚不变量应该是什么)。
建议:不要将链接作为参数并始终将列表初始化为空!或者,仅一个头部作为参数,并通过遍历列表来确定尾部。
List
似乎创建了节点,即它必须拥有元素。如果是这样,它显然需要一个释放它们的析构函数和一个复制构造函数和复制赋值来复制列表(或者可以删除它们以禁用列表复制)。List
的不变量应该是如果设置了head
,tail
指向List 中的最后一个元素
。如果是这样,您只需要测试Head
或tail
(顺便说一句,您应该一致地命名您的成员,可能是head
和尾
).- 您的
add()
函数永远不会设置Head
。这显然是错误的。 - 普通操作(创建
newlink
)应该用普通代码完成:不需要检查条件才创建代码。所有需要有条件的是事情是如何设置的。使用一个常见的技巧(即让tail
指向尾节点而不是尾节点的指针)完全删除条件! first
未初始化。因此,代码是未定义的。无论发生什么都会发生。- 被分配的
person
对象在哪里释放?换句话说:该程序充满了内存泄漏。
find_person()
中的 关于c++ - 链表帮助c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583965/