Linked List

Hello,

I'm having some issues with the following project. It basically reads info in from a txt file and then creates a linked list with nodes in alphabetical order.
I got it to work just fine without worrying about the alphabetical order, but when I throw that in there I get a bunch of errors. I think one of my if statements is swapping my pointers around incorrectly, but I haven't been able to narrow it down that much.
I don't have that much experience with C++ and I think I need a new set of eyes on this.

Any help/tips will be greatly appreciated.

Main.cpp:
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
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;

#include "Node.h"

node* load_nodes(string fname, node *head);

void main()
{
	string fname;
	node *head;

	//Initialize head pointer

	head = NULL;

	//Ask for file name and open

	cout << "Please insert file name:" << endl;
	cin >> fname;

	//Load nodes with info from file

	head = load_nodes(fname, head);

	//Output list of nodes

	cout << left << setw(15) << "Last" << setw(10) << "First" << setw(5) << "Age" << endl;
	cout << left << "--------------" << " " << "---------" << " " << "----" << endl;
	head->list(cout);
		
	system("pause");
}

/**********************************************
* load_nodes - Creates nodes with data from file
**********************************************/
node* load_nodes(string fname, node *head)
{
	node *p;
	node *a, *b;
	fstream infile;
	bool test = true;
	bool test1 = true;

	b = NULL;
	infile.open(fname.data(), ios::in);

	if (!infile.is_open())
	{
		cout << "Unable to open file!" << endl;
		return NULL;
	}

	while (!infile.eof())
	{
		p = new node;
		p->get(infile);
		if (!head)
		{
			head = p;
			cout << "head = p" << endl;
		}
		else if (*p < *head)
		{
			p->next = head;
			head = p;
			cout << "p < head" << endl;
		}
		else if (*p > *head)
		{
			head->insert_2(p, head);
		}
		else return NULL;
	}

	return head;

	infile.close();
	infile.clear();
}


Node.cpp
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
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;

#include "Node.h"

/**********************************************
* node Constructor - null
**********************************************/
node::node()
{
	firstName = "";
	lastName = "";
	age = 0;
	next = NULL;
}

/**********************************************
* node Constructor - with parameters
**********************************************/
node::node(string str1, string str2, int n)
{
	firstName = str1;
	lastName = str2;
	age = n;
	next = NULL;
}

/**********************************************
* node Destructor
**********************************************/
node::~node()
{
	if (next != NULL)
		delete next;
}

/**********************************************
* get - Reads file one line at a time
**********************************************/
void node::get(fstream &infile)
{
	infile >> firstName >> lastName >> age;
}

/**********************************************
* put - Outputs single node data
**********************************************/
void node::put(ostream &out)
{
	out << setw(15) << lastName << setw(10) << firstName << setw(5) << age << endl;
}

/**********************************************
* list - Outputs list of nodes
**********************************************/
void node::list(ostream &out)
{
	put(out);
	if (next != NULL)
		next->list(out);
}

/**********************************************
* insert - Inserts node after calling node
**********************************************/
void node::insert(node *p)
{
	(p->next) = next;
	next = p;

}

/**********************************************
* insert2 - Inserts node after calling node
**********************************************/
void node::insert_2(node *p, node *head)
{
	node *a, *b;
	b = NULL;
	cout << "p > head" << endl;
	a = head;

	while (a != NULL && *p > *a)
	{
		b = a;
		a = a->next;
	}
	b->next = p;
	p->next = a;
}

/**********************************************
* next_node - Finds the next spot to insert alphabetically
**********************************************/
bool node::next_node(node *head, node *p)
{
	return true;
}

/**********************************************
* < operator - Compares lastName, if equal, compares firstName, then age
**********************************************/
bool node::operator < (node n)
{
	if (lastName == n.lastName)
	{
		if (firstName == n.firstName)
		{
			if (age < n.age) return true;
			else return false;
		}
		else if (firstName < n.firstName) return true;
		else return false;
	}
	else
	{
		if (lastName < n.lastName) return true;
		else return false;
	}
}

/**********************************************
* > operator - Compares lastName, if equal, compares firstName, then age
**********************************************/
bool node::operator > (node n)
{
	if (lastName == n.lastName)
	{
		if (firstName == n.firstName)
		{
			if (age > n.age) return true;
			else return false;
		}
		else if (firstName > n.firstName) return true;
		else return false;
	}
	else
	{
		if (lastName > n.lastName) return true;
		else return false;
	}
}

/**********************************************
* == operator - Compares lastName, if equal, compares firstName, then age
**********************************************/
bool node::operator == (node n)
{
	if (lastName == n.lastName)
	{
		if (firstName == n.firstName)
		{
			if (age == n.age) return true;
			else return false;
		}
		else return false;
	}
	else return false;
}


Node Header:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class node
{ public:
	node *next;
	node();											//constructor - null
	node(string str1, string str2, int n);			//constructor - w/parameters
	~node();										//desturctor
	void get(fstream &infile);						//reads file one line at a time
	void put(ostream &out);							//outputs single node data
	void list(ostream &out);						//outputs list of nodes
	void insert(node *p);							//inserts node after calling node
	void insert_2(node *p, node *head);
	bool next_node(node *head, node *p);			//testing this out
	bool operator < (node n);						//compares lastName, if equal, compares firstName
	bool operator > (node n);						//compares lastName, if equal, compares firstName
	bool operator == (node n);						//compares lastName, if equal, compares firstName

  private:
	string firstName;
	string lastName;
	int age;
};


Data file its supposed to read in:
1
2
3
4
5
6
7
8
9
Ann Christensen  70
Carlos Morales   68
David Aowman     45
Frank Towman     37
John Cowman      30
Kathleen Eueller 34
Mark Tawman      42
Richard Uowman   47
Susan Vox        36


Thanks in advance.
Hey there! Find and replace node n with const node& n

That'll get you fixed right up.

Now for the reason... You're passing in a temporary copy of a dereferenced variable. I actually don't think it should crash the way it is, and maybe on some compilers it wouldn't, I'm not positive on the details why, maybe somebody else who knows more about that particular thing can help out here?

[edit]I bet it would work with a proper copy constructor, or assignment operator[/edit]
Last edited on
Yes! Thank you!

I can't believe I did not notice that. I guess staring at the same code for a while makes you blind to some mistakes.

Thank you again. Hope you have a great day!
Topic archived. No new replies allowed.