Sorted Linked List

Hi I'm trying to code a program to insert 12 integers in a linked list, sort them and then output the average and sorted list. I think i have the code mostly right but it wont sort correctly i can't find my problem. Here is my code.

#include <iostream>

using namespace std;

void getData(int& number);

class node_type
{
public:
int num;
node_type *next;
};

int main()
{
node_type *first, *p, *q, *newnode, *secondFirst, *p2, *q2, *secondNewnode;
int i = 0;
int number = 0;
float sum = 0;
float average;

first = new node_type;
p = first;

getData(number);
(*first).num = number;
(*first).next = 0;

for (i = 0; i < 11; ++i)
{
cout << "First " << (*first).num << endl;
getData(number);
newnode = new node_type;
(*newnode).num = number;
(*p).next = newnode;
p = newnode;

if (first == 0)
{
first = newnode;
}
else if ((*newnode).num < (*first).num)
{
(*newnode).next = first;
first = newnode;
}
else if ((*first).next == 0)
{
(*first).next = newnode;
}
else
{
q = first;
p = (*q).next;

while ((*p).num < ((*newnode).num) && ((*p).next != 0))
{
q = p;
p = (*p).next;
}

if ((*p).num > (*newnode).num)
{
(*q).next = newnode;
(*newnode).next = p;
}
}

}
q = first;

cout << "The List contains:" << endl;

while ((*q).next != 0)
{
cout << (*q).num << endl;
sum = sum + (*q).num;
q = (*q).next;
}
average = sum/12;
cout << "The average of all the integers is " << average << endl;

}
void getData(int& number)
{
cout << "Enter an integer." << endl;
cin >> number;
}
closed account (D80DSL3A)
You're close. Mostly just failing to include the last node in the list.
Here is some corrected code for main()
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
int main()
{
node_type *first=0, *p, *q, *newnode;//, *secondFirst, *p2, *q2, *secondNewnode;
int i = 0;
int number = 0;
float sum = 0;
float average;

/* // OK but not needed
first = new node_type;
p = first;

getData(number);
(*first).num = number;
(*first).next = 0;
*/

for (i = 0; i < 12; ++i)
{
//cout << "First " << (*first).num << endl;
getData(number);

newnode = new node_type;
(*newnode).num = number;
//(*p).next = newnode;// BAD!!
//p = newnode;// maybe ok but no need

if (first == 0)
{
    first = newnode;
}
else if ((*newnode).num < (*first).num)
{
    (*newnode).next = first;
    first = newnode;
}
else if ((*first).next == 0)
{
    (*first).next = newnode;
}
else
{
    q = first;
    p = (*q).next;

//while ((*p).num < ((*newnode).num) && ((*p).next != 0))// misses last node
while ((p != 0) && (*p).num < ((*newnode).num))
{
    q = p;
    p = (*p).next;
}

//if ((*p).num > (*newnode).num)// no need to qualify and p may be NULL - end of list
//{
    (*q).next = newnode;
    (*newnode).next = p;
//}
}

}


q = first;
cout << "The List contains:" << endl;
// while ((*q).next != 0)// misses last node
while (q != 0)
{
cout << (*q).num << endl;
sum = sum + (*q).num;
q = (*q).next;
}
average = sum/12;
cout << "The average of all the integers is " << average << endl;
}
 
(*newnode).num = number;


Why not use the pointer operator(->) ?
 
newnode->num = number;
Topic archived. No new replies allowed.