Click here to Skip to main content
15,891,649 members
Please Sign up or sign in to vote.
3.00/5 (1 vote)
See more:
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.

C++
#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;
}
Posted
Comments
Sergey Alexandrovich Kryukov 11-Apr-15 19:27pm    
This is not quite C++. This is not a very good idea to use functions which are not members of types, at least not in this application. In this case, there is no clear separation of link list functionality from I/O and some test functionality. You even mixed concrete type person with templates.

So, I would advise to rewrite all code in an accurate manner first, and only then test and debug it. And only then the code would become worth considering.

By the way, when you rewrite code, you will more likely spot your bugs. If it does not work immediately, test and use the debugger.

—SA
nv3 12-Apr-15 4:19am    
You should get familiar with using a debugger. It's a must for every developer. The earlier you start, the better.
Sugar Richard 12-Apr-15 6:46am    
This definitely needs a rewrite for all of the reasons already given, but from a purely functional standpoint, it's almost correct.

The immediate fix is in member function List<T>::find_person local variable first is uninitialized. Should be first = this->Head.

1 solution

You don't search from the head of the list in find_person;
Change;
XML
Link<person> * find_person(string Fname, string Lname)//finds person based on user input
{
    Link<person>* first;
    Link<person> * temp = first;


To something like;
XML
Link<person> * find_person(string Fname, string Lname)//finds person based on user input
{
    Link<person>* first = Head;
    Link<person> * temp = first;


Hope this helps,
Fredrik
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900