jack
jack

Reputation: 19

Linked List help c++

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

Answers (1)

Dietmar K&#252;hl
Dietmar K&#252;hl

Reputation: 154045

The code is certainly not correct. Here are a couple of things I spotted (the list is unlikely to be complete):

  1. The List constructor is misguided in pretty much all ways I can think of:

    1. There is rarely a good reason not to use a member initializer list (although this is the least of its problems).
    2. If the constructor is given a head and a tail the length is certainly wrong.
    3. What should happen if it is given either a head or a tail but not the other? It seems that would put the list into an inconsistent state (well, it is unclear from your implementation what the invariants should be).

    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.

  2. The 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).
  3. The invariant of the 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).
  4. Your add() function never sets Head. That is clearly wrong.
  5. Common operations (creation of 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!
  6. first in find_person() goes uninitialized. The code is, thus, undefined. Whatever happens happens.
  7. Where is the person object being allocated released? Put differently: the program is riddled with memory leaks.

Upvotes: 1

Related Questions