Lista circular simple de enteros con 1 puntero

Iniciado por Beginner Web, 29 Septiembre 2018, 04:32 AM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Hola quiero hacer un procedimiento recursivo que me cuente los valores negativos de una lista circular simple con un puntero, alguien me ayuda?

Código (cpp) [Seleccionar]
void contar_negativos(pnodo lista, int &n)
{
if(lista->sig!=lista){
if(lista->dato<0){
n++;
}
contar_negativos(lista->sig,n);
}
}
7w7

Serapis

De entrada llevas chorrocientos hilos-mensajes dando vueltas a las listas. No es el procemiento adecuado para aprender inventarse un problema, quedar atascado y tener que preguntar para salir del escollo una y otras vez hasta las chorrocientas que llevas...

Tómate un libro o la misma wikipedia y antes de nada más, estudia, estudia y estudia. De modo que cuando te pongas a hacer cosas, sean simples detalles los que falles o no entiendas y además relacionados de verdad con listas.

...y digo relacionado, porque carece absolutamente de interés ninguno, tener una lista circular y pretender recorrerla de modo recursivo (y encima para... no importa qué...). Es un atropello a la programación. Es como tener un bicicleta y pretender intercambiar el sillín con el manillar para conducirla así... para qué????, es perder el tiempo en cosas inútiles. Gasta tu tiempo con cosas útiles...

Lo interesante de una lista es que tiene punteros Siguiente (y Anterior si se precisa), que facilitan su recorrido y adicionalmente u opcionalmente, un ítem Actual (con su posición y cuenta total de ítems), que facilita determinar si es más rápido acceder desde el actual desde el último o desde el primero (cuando se reclama un índice).... ...entonces si una lista ya proporciona métodos específicos para el recorrido de la lista, es absurdo pretender usar recorridos no naturales (subóptimos), de recorrido, solo porque sí...

Si ya sabes crear listas, recorrerlas, buscar ítems, añadir, eliminar, unir listas, disgregar elementos de una lista a otra, etc... entonces ya sabes lo fundamental de las listas, pasa a otra cosa, avanza... no te enfangues en cosas absurdas que no tienen sentido de ser. Aprende cosas que no sepas, pero útiles.

Beginner Web

7w7

Serapis

Perdona. No intento ofenderte, intento que veas la luz...

Si ya dominas más o menos las listas y supongo que las pilas, colas y arrays, ahora salta a los árboles... ahí, hay recorridos distintos y muy interesantes, pero útiles al fin y al cabo.

Beginner Web

Si gracias, esta bien, lo que pasa es que me gusta la recursividad y queria resolver ese problema,  por cierto domino arreglos, registros, listas y pilas,  y ahora estoy aprendiendo archivos , lo que le sigue son colas, arboles y grafos, despues de eso no se que sigue, pero planeo empezar la programacion orientada a objetos  :(
7w7

MAFUS

Debes saber que los métodos recursivos gastan mas memoria que los iterativos. Cada vez que se llama la función recursiva crea un marco en el stack. Cuánta más veces se repita y cuántas más variables locales use más rápido llenará la memoria del programa.
Por esta razón una función recursiva es mas lenta ya que debe generar todo el marco, cambiar los registros del procesador para que apunten a la nueva memoria, copiar los datos de los argumentos de la función, ejecutar una instrucción de salto (que en el peor de los casos, si el predictor del procesador ha fallado, debe cargar de nuevo el IP y saltar a esa instrucción; es el doble de lento). De igual forma cuándo la función termina se debe limpiar la pila y saltar a la instrucción que hay después de la llamada.

Con métodos iterativos todo esto te lo saltar y sólo suele haber una instrucción de comparación y otra de salto.

Por tanto sólo se deben usar métodos recursivos cuando haya una clara ventaja de éstos sobre los iterativos.

Beginner Web

Pensando un poco lo pude resolver olvide poner la estructura de datos que tenia el programa.

Código (cpp) [Seleccionar]

typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
int contador;
};

void contar_negativos(pnodo nodo, tlista lista, int &n)
{
pnodo i=nodo;
if(lista.contador!=0){
if(i->dato<0){
n++;
}
lista.contador--;
contar_negativos(i->sig,lista,n);
}
}
  ;-)
7w7