List sorter not working all of the time

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
#include <iostream>

using namespace std;

struct Nod{ float a; Nod *adr; };


Nod *v, *p, *sf;

void add_first(Nod *&v, float val)
{
    p=new Nod;
    p->a=val;
    p->adr=v;
    v=p;
}

void output(Nod *v)
{
    p=v;
    while(p)
    {
        cout<<p->a<<" ";
        p=p->adr;
    }
}

void add_last(Nod *&v, Nod *&sf, float val)
{
    if(v==0)
    {
        v=new Nod;
        v->a=val;
        sf=v;
        v->adr=0;
    }
    else
    {
        p=new Nod;
        p->a=val;
        p->adr=0;
        sf->adr=p;
        sf=p;
    }
}

void add_after(Nod *v, float val, float valadd)
{
    Nod *q;
    p=v;
    while(p->a!=val&&p->adr)
    p=p->adr;
    if(p->a==val)
    {
        q=new Nod;
        q->a=valadd;
        q->adr=p->adr;
        p->adr=q;

    }else cout<<"Number not found.\n";
}

void add_before(Nod *&v, float val, float valadd)
{
    Nod *q, *p;
    p=v;
    if(v->a==val)
    {
        p=new Nod;
        p->a=valadd;
        p->adr=v;
        v=p;
    }
    else
    {   p=v;
        while(p->adr->a!=val&&p->adr->adr)
            p=p->adr;



    if(p->adr->a==val)
    {
        q=new Nod;
        q->a=valadd;
        q->adr=p->adr;
        p->adr=q;
    }
    else cout<<"Number not found.\n";
    }

}


void sort(Nod *&v, float val)
{
    Nod *p;

    if(val<=v->a)
    {
        p=new Nod;
        p->a=val;
        p->adr=v;
        v=p;
    }
    else
    {
        p=v;
        while(p->a>val&&p->adr->a<=val&&p->adr->adr)
        p=p->adr;

        if(p->a<val&&p->adr->a>val)
        add_before(v, p->adr->a, val);
        else add_after(v, p->adr->a, val);
    }
}

int main()
{
    int i=0, x, l;

    cout<<"Number of nodes: ";
    cin>>l;
    cout<<"Node "<<i<<": "; i++;
    cin>>x;
    add_first(v, x);
    cout<<"Node "<<i<<": "; i++;
    cin>>x;
    if(l>1)
    {
    if(x<=v->a) add_before(v, v->a, x);
    else add_after(v, v->a, x);

    for(i=2; i<l; i++)
    {
        cout<<"Node "<<i<<": ";
        cin>>x;
        sort(v, x);
    }

    }
    output(v);

    return 0;
}


This code is supposed to put the numbers in a list in order as I input them. The code works for some numbers but for some it doesn't. I wasn't able to pinpoint the issue but I'll attach a screenshot of a time it didn't work.
I would really appreciate it if you could correct my code or if you can tell me another way of writing a code for this.
Thanks in advance :)

SCREENSHOT: http://imgur.com/776pc
1
2
3
4
5
6
7
    if(val <= v->a)
        /**/
    else
    {
        p=v;
        while(p->a > val and /**/)
            p=p->adr; //this is never executed 

Last edited on
Could you help me with a fix for this?
The only function that you need is sort() (weird name, btw)
Or if you prefer iterator list::lower_bound(float), list::insert(iterator, float); as helpers.

A possible implementation:
As you are using single linked list, there is a trick. The iterator does not point to the node that represents, but to the one that is before it.
That way you can easily change the links.
However that gives troubles with the first node. Either you treat the nullptr different, or you create an empty head.

I don't like that of passing pointers by reference, or to give global scope at variable that are not used as such.
Topic archived. No new replies allowed.