elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar puntero en recursion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar puntero en recursion  (Leído 3,141 veces)
LadyWin

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Pasar puntero en recursion
« en: 29 Agosto 2021, 06:46 am »

Hola! como andan? Ya he hecho varios post respecto a los punteros y de a poco le estoy agarrando la mano gracias a sus consejos.  ;D
Ahora estoy creando una lista en donde voy agregando los elementos al final de modo recursivo, pero me sale ciertos errores, entiendo que es un problema en los punteros pero he visto varias funcionalidades de otras personas que lo escriben asi y al parecer no les sale el mismo inconveniente, o como seria la correcta forma de escribirlo? si me pueden ayudar seria de gran ayuda!
  ;-)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct rLista
  5. {
  6. int dato;
  7. struct rNodo * sig;
  8. } * tLista;
  9.  
  10. tLista * crear_nodo (int nuevo_dato)
  11. {
  12. tLista * nuevo_elemento = (tLista*) malloc (sizeof(tLista));
  13. (*nuevo_elemento)->dato = nuevo_dato;
  14. (*nuevo_elemento)->sig = NULL;
  15. return nuevo_elemento;
  16. }
  17. tLista agregar_final (tLista * ppio, tLista * nuevo_elemento)
  18. {
  19. if (!ppio) ppio = nuevo_elemento;
  20. else
  21. ppio->sig = agregar_final(ppio->sig,nuevo_elemento); //error: '*ppio' is a pointer; did you mean to use '->'?
  22.  
  23. return *ppio;
  24. }
  25. int contar_elementos (tLista * ppio)
  26. {
  27. int contador;
  28.  
  29. if (!ppio) return 0;
  30. else contador = contar_elementos(ppio->sig); // error: '*ppio' is a pointer; did you mean to use '->'?
  31.  
  32. return contador;
  33. }
  34.  
  35.  
  36. int main (void)
  37. {
  38. tLista ppio = NULL;
  39.  
  40. ppio = agregar_final(&ppio,crear_nodo(5));
  41.  
  42. return 0;
  43. }


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Pasar puntero en recursion
« Respuesta #1 en: 29 Agosto 2021, 12:48 pm »

Te he modificado el programa para que funcione y te he escrito en los comentarios el por qué de cada cambio.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //
  5. // Acuérdate de realizar uan función que libere todos los nodos que hayas creado.
  6. //
  7.  
  8. // rNodo no existe, al menos en este código que nos has pasado
  9. typedef struct rLista {
  10. int dato;
  11. struct rLista * sig;
  12. } * tLista;
  13.  
  14. // tLista ya es un puntero. Esta función sólo genera un dato en en heap y lo devuelve,
  15. // por tanto no hay que regresar un puntero a puntero.
  16. tLista crear_nodo (int nuevo_dato) {
  17. tLista nuevo_elemento = malloc (sizeof(struct rLista));
  18. nuevo_elemento->dato = nuevo_dato;
  19. nuevo_elemento->sig = NULL;
  20. return nuevo_elemento;
  21. }
  22.  
  23. // nuevo_elemento debe ser un puntero a la dirección del heap con el contenido
  24. // relleno de la estructura y por tanto no un puntero a puntero,
  25. tLista agregar_final (tLista * ppio, tLista nuevo_elemento) {
  26.    // ppio es un puntero a puntero y eso es para que puedas modificar el puntero que
  27.    // está en otra función. ppio debe ser dereferenciado
  28. if (!*ppio) *ppio = nuevo_elemento;
  29. // El parámetro que se debe pasar a agregar_final es el puntero al campo sig del dato apuntado por ppio
  30. // por eso debe pasarse la referencia & a sig del puntero -> al que hace referencia * ppio
  31. else (*ppio)->sig = agregar_final(&((*ppio)->sig), nuevo_elemento);
  32.  
  33. return *ppio;
  34. }
  35.  
  36. //tLista ya es un puntero y solo hay que recorrerlo, no hay que pasarle un puntero a puntero
  37. int contar_elementos (tLista ppio) {
  38. if (!ppio) return 0;
  39. // Usar una variable contandor haría que se reiniciara cada vez, por tanto lo que hay que hacer
  40. // es añadir 1 a la siguiente llamada a la faunción. Así es como funciona la recursión:
  41. // Cuando ppio sea NULL devolverá 0 y no hará más llamadas, la función anterior devolverá 1 + 0,
  42. // la anterior devolverá 1 + 1 + 0... y así se recorrerá la lista de llamadas hasta la función inicial
  43. // que devolverá la suma de todas las llamadas al llamante
  44. else return 1+contar_elementos(ppio->sig);
  45. }
  46.  
  47. int main (void) {
  48. tLista ppio = NULL;
  49.  
  50. agregar_final(&ppio,crear_nodo(5));
  51. agregar_final(&ppio,crear_nodo(6));
  52.  
  53.        // Muestra el uso de contar_elementos
  54. printf("Elementos en la lista: %d", contar_elementos(ppio));
  55. }


En línea

LadyWin

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Pasar puntero en recursion
« Respuesta #2 en: 30 Agosto 2021, 00:15 am »

Te he modificado el programa para que funcione y te he escrito en los comentarios el por qué de cada cambio.



Muchisimas gracias, no solo me has ayudado con mi duda sino tambien con otros errores que tenia, mil gracias!   ;-) ;D ;-) ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pasar por referencia un puntero
Programación C/C++
m@o_614 2 7,101 Último mensaje 18 Enero 2014, 18:13 pm
por rir3760
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
NOB2014 3 3,069 Último mensaje 9 Junio 2016, 17:10 pm
por geeke
Pasar vector de puntero a char a las funciones[C] « 1 2 »
Programación C/C++
NOB2014 16 10,248 Último mensaje 22 Junio 2016, 14:56 pm
por NOB2014
Recursion en bst
Programación C/C++
Beginner Web 6 2,076 Último mensaje 21 Enero 2019, 10:47 am
por dijsktra
Recursión
Java
padiuwu 1 1,674 Último mensaje 18 Marzo 2019, 20:36 pm
por spcruzaley
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines