Reputation: 19
Basically what I need help with is the initialization of my find_person and print_person methods to work in main.Right now when I run the program, nothing happens except for the cout and cin stuff in main. The methods are pretty close if not completely correct(If they're not please let me know) (fyi, state and person info is from the same file, I just get all the info out for the person object and just the state string out for the state object.) Any help would be appreciated Thanks.
#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;
}
Upvotes: 0
Views: 62
Reputation: 154045
The code is certainly not correct. Here are a couple of things I spotted (the list is unlikely to be complete):
The List
constructor is misguided in pretty much all ways I can think of:
Advice: do not take links as argument and always initialize the list as empty! Alternatively, take only a head as argument and determine the tail by walking the list.
List
seems to create nodes, i.e., it is bound to own the elements. If that's so, it clearly needs a destructor releasing them and a copy constructor and copy assignment to copy the list (or they can be deleted to disable copying of lists).List
should be that if a head
is set, tail
points to the last element in the List
. If that's so, you only need to test either the Head
or the tail
(BTW, you should name your members consistently, probably head
and tail
).add()
function never sets Head
. That is clearly wrong.newlink
) should be done by common code: there is no need to create the code only after checking the condition. All what needs to be conditional is how things are set up. Using a common trick (i.e. to have tail
point at the pointer to the tail node rather than tail node) removes the conditional entirely!first
in find_person()
goes uninitialized. The code is, thus, undefined. Whatever happens happens.person
object being allocated released? Put differently: the program is riddled with memory leaks.Upvotes: 1