SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: AdolfoC en Domingo 6 de Junio de 2010, 13:14

Título: Función Anidada
Publicado por: AdolfoC en Domingo 6 de Junio de 2010, 13:14
Hola a todos:

Estoy preparando una pequeña aplicación que usa una lista enlazada. A la hora de crear un nuevo nodo con datos, debo usar una función que además de crear el nodo lo inserte en su sitio.

Todos los fputs/fgets y printf/scanf se solicitan en el programa principal, es decir, las funciones solo realizan las operaciones necesarias y retornan un valor para usar en el "main".

Teniendo esto en cuenta, si la función "crear_nodo" está anidada en la función "insertar_nodo", sería posible pasarle de algún modo los  parámetros necesarios a la función "crear_nodo"?

Ejemplo:

int insertar_nodo (str_nodo **cabeza)
{
   str_nodo *actual;
   str_nodo *anterior;
...
   str_nodo *elem = crear_nodo ( DE DÓNDE PUEDO RECIBIR LOS PARAMETROS?);
   
....
}

Si no quedase otro remedio realizaría las funciones separadamente, pero si fuese posible realizarlo de este modo sería estupendo.

Muchas gracias por la ayuda y saludos!!!
Título: Re: Función Anidada
Publicado por: Jeysscarr en Domingo 6 de Junio de 2010, 14:13
deberias poder pasar un puntero de entrada y salida [ **nuevoNodo ], que mandes como parametro vacio (NULL) a la función CrearNodo junto con los valores de la esctructura, y que esta en su interior le asigne el espacio en memoria y los datos, despues que se ejecute la función crear nodo, seguiria buscar el ultimo nodo, para agregar este que acabas de crear como el que le sigue...

un ejemplo:

Código: C++
  1. //Una estructura cualquier
  2. Estructura Persona{ int edad; char *nombre; persona *Siguiente}
  3.  
  4. void insertarNodo(parametros)
  5. {
  6.     //acciones
  7.  
  8.     Persona Nuevo=NULL;
  9.     CrearNodo(**Nuevo, 16, "EL nombre de la persona",**cabeza,);
  10.  
  11.     //en la funcion usaras Malloc.. siseof y todo lo que necesites para darle un espacio en memoria y me imagino que haras algo asi para
  12.         //buscarle la posicion en la lista
  13.  
  14.         [color=#804040]Persona *ptr=*cabeza;
  15.     while(*ptr->siguiente!=NULL)
  16.         *ptr=ptr->siguiente;
  17.  
  18.     //y continuas con lo tuyo[/color]
  19. }
  20.  
Título: Re: Función Anidada
Publicado por: AdolfoC en Domingo 6 de Junio de 2010, 14:37
Jey, tu respuesta es sumamente aclaratoria, no obstante aun me queda la siguiente duda:

Los valores correspondientes al contenido de la estructura están en el "main", asignados a las variables que les corresponda.

Cómo hago para hacerle llegar estas variables al campo de parámetros de "nuevo_nodo"?  Quiero decir, le puedo pasar esos parámetros y que los "reciba" directamente del main a pesar de tratarse de una función anidada en otra?
Agradezco mucho la ayuda.

Un saludo!!!
Título: Re: Función Anidada
Publicado por: Epa en Lunes 7 de Junio de 2010, 17:25
cual es el problema con usarlas por separado.
Que pasa si queres insertar un nodo que ya tenes creado?

Algo que podrias hacer es:

void insertar(nodo *cabeza, nodo *nuevo);
nodo* nuevonodo(tuestructura datos);

y despues llamar:

insertar(cabeza, nuevonodo(dato));

o sino crear una tercera funcion:
Código: C++
  1.  
  2. void creainserta(nodo *cabeza, tuestructura datos)
  3. {
  4.    insertar(cabeza, nuevonodo(datos));
  5. }
  6.  
  7.  

Saludos
Título: Re: Función Anidada
Publicado por: AdolfoC en Lunes 7 de Junio de 2010, 18:06
Claro!!! Es genial, no se me ocurrió realizarlo de ese modo.

Muchas gracias a ambos por la ayuda!!!