Linked List Database help

So here I have a linked list program, I believe most of my functions work but I can't test them because I am not sure how to call them correctly in main.Mainly I just need the find person and print person to work.(Again I'm pretty sure the functions work fine I'm just not sure how to call them correctly in main(using the proper syntax) We just started using Linked Lists and I'm still pretty new to templates, so my syntax is likely off. Basically all i need is for the commented functions in main to run(mainly the find and print person). Any help would be appreciated. Thanks



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#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;} }
    }

   

void print_states()//prints all states
{
    Link<T> * temp = Head;
    
    while (temp !=NULL)
    {
        cout << "State:"<< temp->data->sname<<endl;
        temp=temp->next;
        
    }
}

Link<state> * find_state(Link<T> * first, string search)//finds state based on user input
{
    Link<state> * temp = first;
    while (temp !=NULL)
    {
        if(temp->data->sname == search)
        {
            return temp;
        }
        temp = temp->next;
    }
    return NULL;
}
Link<person> * find_person(string Fname)//finds person based on user input
{
    Link<person>* first;
    Link<person> * temp = first;
    
    while (temp != NULL)
    {
        if (temp->data->fname==Fname )
        {
            
            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";
        
        
    }
}
void print_people_in_state(Link<state> *  printS)//prints all people in searched state
{
    if (printS == NULL)
        cout << "No states match search \n\n";
    else
    {
        cout << "SEARCH RESULTS FOR STATE: \n" << "Name: " << printS->data->sname <<
       "\n\n";
        cout << "ALL PEOPLE IN STATE: \n";
        //print_person (printS->extradata);
        cout<<"\n\n";
    }
}
};
List<person>*person_from_file(string file)//reads file and creates linked list 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 and creates linked list 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<<"Would you like a list of states, y/n?"<<endl;;
    char a;
    cin>>a;
    if(a=='y')
    { B->print_states();}
    else if(a == 'n')
    {
        cout<<"well fine then!!";
    }
    cout<<"Search for Person: ";
   
    string f,l;
    cin>>f;
    Link<person> *x=A->find_person(f);
    A->print_person(x);
//    Link<state>*y=B->find_state(B->Head,"TX");
//    B->print_people_in_state(y);
//    
    
    
    return 0;
}
Last edited on
This does not seem like a correct use of templates. Other than your constructor and add functions, all functions of list assume things about T. For example, line 129, what is printS->sdata->sname?

Anyway, to call your functions in main you would use

1
2
3
4
Link<person> *a = A->find_person(f, l);
A->print_person(a);
Link<state> *b = B->find_state(B->head, "TX");
B->print_people_in_state(b);
Just fixed line 129

When I do what you said for main() I get errors on line 114 which says "No member named fname in "state". Is this because my use of templates is wrong? If so could help me to fix it? Thanks
The error you're getting seems like you're trying to call print_person with a Link<state>* parameter, which would obviously not work. But if you follow the code I gave you, that shouldn't happen. Maybe you should post what you have in main now.

As for your use of templates, I can't remember the term for what I'm thinking of. I think the concept is that use of templates should be independent of the data they represent.

Your find_person and print_person functions only work if used with list<person>. For example, if someone tried to use them with list<int> they wouldn't work. Your find_state and print_people_in_state functions only work with list<state>.

They shouldn't be defined in your class, because these functions are data-specific. They should be defined outside of your class so that they only work with the specific data types that they are made for.

Example prototypes:
1
2
3
4
Link<state> * find_state(list<state> * listS, string search);
Link<person> * find_person(list<person> * listP, string Fname, string Lname);
void print_person(Link<person> * printP);
void print_people_in_state(Link<state> *  printS);
I think iv'e fixed most of the stuff i my code above. When I run it it can do the print states function but when i uncomment lines 221 and 222 and i type in a fist and last name it does nothing. Do you know why that is?
Last edited on
Line 99 should be deleted and line 100 should be Link<person> * temp = Head;.

Is there some reason you have to use linked lists or why you can't use one of the STL containers?
It's for a class and our teacher wants us to use linked lists.
Have you considered simplifying your code? Instead of having both person and state as structs, why not just have person?

I'm asking because part of your code seems to ask the user for a state, then print all the people who live in that state. But when you read your file to create the state objects, you didn't provide them with a way to link to the person objects living in the state. But that's exactly how you try to find them in one of your functions, through a non-existent link.
Topic archived. No new replies allowed.