Using a counter for recursion

Hello, so I've had this weird problem. I was making a list and i wanted to be able to add a node at any point in the list. I tried using a counter and recursion to add a new node. However while the counter works it comes to a point that when it enters a new function it turns back to 0 and it loses the previous value it had and I don't really understand why. I'm adding the code below.

I put a cout to check until which point the value of the counter remains. It seems to work until the recursion function around line 80. After that if i put a cout during the main or during the new function the counter gives a value of 0. The counter is called cont2.

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
  #include <iostream>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
struct nodo
{
    string nombre;
    struct nodo *sig;
};
 
void llenar (nodo *, nodo *, nodo *, int, int);
void recursion (nodo *, nodo *, nodo *, int, int);
void leer (nodo *);
void busqueda (nodo *, nodo *, string, int, int, nodo *, nodo *);
 
 
 
int main(int argc, char** argv) {
   
    int res=1, cont=0, cont2=0;
    string buscar;
    nodo *p, *q, *t, *s, *l;
   
    p = new nodo;
 
    llenar (p, q, t, res, cont2);  
   
    cout<<"Digite el nodo al que usted quiere encontrar\n";
    cin>>buscar;
   
    busqueda (p, q, buscar, cont, cont2, s, l);
   
    return 0;
}
 
void llenar (nodo *p, nodo *q, nodo *t, int res, int cont2)
{
   
    cout<<"Digite el primer nombre\n";
    cin>>p->nombre;
    p->sig=NULL;
    t=p;
   
    cout<<"Desea agregar otro nombre:\n1) si\n2) no\n";
    cin>>res;
   
    while(res!=1&&res!=2)
    {
        cout<<"Ingreso equivocado. Por favor ingrese el numero 1 o 2\n";
        cin>>res;
    }
   
    recursion (p, q, t, res, cont2+1);
   
   
}
 
void recursion (nodo *p, nodo *q, nodo *t, int res, int cont2)
{
    if (res==1)
    {
        q = new nodo;
        cout<<"Digite el nombre\n";
        cin>>q->nombre;
        q->sig=NULL;
        t->sig=q;
        t=q;
       
        cout<<"Desea agregar otro nombre:\n1) si\n2) no\n";
        cin>>res;
       
        recursion (p,q,t,res, cont2+1);
    }
   
    else if(res==2)
        {
            leer (p);
        }
 
}
 
void leer (nodo *p)
{
    nodo *s = p;
    if (s!=NULL)
    {
        cout<<s->nombre<<" ";
        s=s->sig;
        leer(s);
    }
    if (s==NULL)
    {
        cout<<endl;
    }
}
 
void busqueda (nodo *p, nodo *q, string buscar, int cont, int cont2, nodo *s, nodo *l)
{
    if (cont==0)
    {
        nodo *s = p;
        nodo *l = p;
       
        if (s->nombre==buscar)
        {
            int resp;
            cout<<"Desea poner un nodo\n1) antes\n2) despues\n";
            cin>>resp;
           
            while (resp!=1&&resp!=2)
            {
                cout<<"Por favor digite o el 1 o el 0\n";
                cin>>resp;
            }
           
            switch (resp)
            {
                case 1:
                    {
                        nodo *r;
                        r = new nodo;
                        cout<<"Digite el nombre del nuevo nodo\n";
                        cin>>r->nombre;
                        r->sig=s;
                        leer (r);
                        break;
                    }
                case 2:
                    {
                        nodo *r;
                        r = new nodo;
                        cout<<"Digite el nombre del nuevo nodo\n";
                        cin>>r->nombre;
                        s->sig=r;
                        r->sig=NULL;
                        leer (p);
                        break;
                    }
            }
        }
       
        else
        {
            s=s->sig;
            busqueda (p, q, buscar, cont+1, cont2, s, l);
        }
    }
   
    else if (cont<cont2)
    {
        if (s->nombre!=buscar)
        {
            s=s->sig;
            q=q->sig;
            busqueda (p, q, buscar, cont+1, cont2, s, l);
        } //cambiar esto por el switch.
       
        else if (s->nombre==buscar)
        {
            int resp;
            cout<<"Desea poner un nodo\n1) antes\n2) despues\n";
            cin>>resp;
           
            while (resp!=1&&resp!=2)
            {
                cout<<"Por favor digite o el 1 o el 0\n";
                cin>>resp;
            }
           
            switch (resp)
            {
                case 1:
                    {
                        nodo *r;
                        r = new nodo;
                        cout<<"Digite el nombre del nuevo nodo\n";
                        cin>>r->nombre;
                        l->sig=r;
                        r->sig=s;
                        leer (p);
                        break;
                    }
       
 
            }
        }
    }    
   
    else if (cont == cont2)
    {
        int resp;
            cout<<"Desea poner un nodo\n1) antes\n2) despues\n";
            cin>>resp;
           
            while (resp!=1&&resp!=2)
            {
                cout<<"Por favor digite o el 1 o el 0\n";
                cin>>resp;
            }
    }
   
    else
    {
        cout<<"No se encontro el nombre en la lista\n";
    }
}
I’m not sure I’ve understood your problem.
Even if your program seems not complete, the following version apparently works to me.
Could you please let us know if it gives you the same problem?
Could you provide an example of the expected output and the obtained output?

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

struct nodo {
    std::string nombre;
    struct nodo *sig { nullptr };
};

void llenar (nodo *p, nodo *q, nodo *t, int cont2);
void recursion (nodo *p, nodo *q, nodo *t, int res, int cont2);
void leer (nodo *p);
void busqueda (nodo *p, nodo *q, std::string buscar,
                int cont, int cont2, nodo *s,
                nodo *l);

int main()
{
    int cont2 {};
    nodo *q { nullptr }, *t { nullptr };
    nodo * p { new nodo };
    llenar (p, q, t, cont2);

    std::cout << "Digite el nodo al que usted quiere encontrar: ";
    std::string buscar;
    std::cin >> buscar;

    int cont {};
    nodo *s { nullptr }, *l { nullptr };
    busqueda (p, q, buscar, cont, cont2, s, l);

    return 0;
}


void llenar (nodo *p, nodo *q, nodo *t, int cont2)
{
    std::cout << "Digite el primer nombre: ";
    std::cin >> p->nombre;
    t = p;

    std::cout << "Desea agregar otro nombre:\n1) si\n2) no\n>>> ";
    int res;
    std::cin >> res;

    while(res != 1 && res != 2) {
        std::cout << "Ingreso equivocado. Por favor ingrese el numero 1 o 2: ";
        std::cin >> res;
    }

    recursion(p, q, t, res, cont2 + 1);
}


void recursion (nodo *p, nodo *q, nodo *t, int res, int cont2)
{
    if (res == 1) {
        q = new nodo;
        std::cout << "Digite el nombre: ";
        std::cin >> q->nombre;
        t->sig = q;
        t = q;

        std::cout << "Desea agregar otro nombre:\n1) si\n2) no\n>>> ";
        std::cin >> res;
        while(res != 1 && res != 2) {
            std::cout << "Ingreso equivocado. Por favor ingrese el numero 1 o 2: ";
            std::cin >> res;
        }

        recursion(p, q, t, res, cont2 + 1);
    } 

    else if(res == 2) {
        leer (p);
    }
}


void leer (nodo *p)
{
    if (p != nullptr) {
        std::cout << p->nombre << ' ';
        nodo *s { p->sig };
        leer(s);
    } else {
        std::cout << '\n';
    }
}


void busqueda (nodo *p, nodo *q, std::string buscar, 
                int cont, int cont2, nodo *s,
                nodo *l)
{
    if (cont == 0) {
        nodo *s { p };
        nodo *l { p };

        if (s->nombre == buscar) {
            std::cout << "Desea poner un nodo\n1) antes\n2) despues\n>>> ";
            int resp;
            std::cin >> resp;

            while (resp != 1 && resp != 2) {
                std::cout << "Por favor digite o el 1 o el 2: ";
                std::cin >> resp;
            }

            switch (resp) {
            case 1:
                {
                    nodo *r { new nodo };
                    std::cout << "Digite el nombre del nuevo nodo: ";
                    std::cin >> r->nombre;
                    r->sig = s;
                    leer (r);
                    break;
                }
            case 2:
                {
                    nodo *r { new nodo };
                    std::cout << "Digite el nombre del nuevo nodo: ";
                    std::cin >> r->nombre;
                    s->sig = r;
                    r->sig = nullptr;
                    leer (p);
                    break;
                }
            }
        }

        else {
            s = s->sig;
            busqueda (p, q, buscar, cont + 1, cont2, s, l);
        }
    }

    else if (cont < cont2) {
        if (s->nombre != buscar) {
            s = s->sig;
            q = q->sig;
            busqueda (p, q, buscar, cont+1, cont2, s, l);
        } //cambiar esto por el switch.

        else if (s->nombre == buscar) {
            int resp;
            std::cout << "Desea poner un nodo\n1) antes\n2) despues\n>>> ";
            std::cin >> resp;

            while (resp != 1 && resp != 2) {
                std::cout << "Por favor digite o el 1 o el 2: ";
                std::cin >> resp;
            }

            switch (resp) {
            case 1:
                {
                    nodo *r { new nodo };
                    std::cout << "Digite el nombre del nuevo nodo: ";
                    std::cin >> r->nombre;
                    l->sig = r;
                    r->sig = s;
                    leer (p);
                    break;
                }
            }
            // ??? Single case switch?
        }
    }

    else if (cont == cont2) {
        int resp;
        std::cout << "Desea poner un nodo\n1) antes\n2) despues\n>>> ";
        std::cin >> resp;

        while (resp != 1 && resp != 2) {
            std::cout << "Por favor digite o el 1 o el 2: ";
            std::cin >> resp;
        }
    }

    else {
        std::cout << "No se encontro el nombre en la lista\n";
    }
}


Digite el primer nombre: 13
Desea agregar otro nombre:
1) si
2) no
>>> 1
Digite el nombre: 666
Desea agregar otro nombre:
1) si
2) no
>>> 23
Ingreso equivocado. Por favor ingrese el numero 1 o 2: 54
Ingreso equivocado. Por favor ingrese el numero 1 o 2: 1
Digite el nombre: 12
Desea agregar otro nombre:
1) si
2) no
>>> 1
Digite el nombre: 665
Desea agregar otro nombre:
1) si
2) no
>>> 2
13 666 12 665
Digite el nodo al que usted quiere encontrar: 666
No se encontro el nombre en la lista

Topic archived. No new replies allowed.