UTNianos

Versión completa: [Ejercicio resuelto] Funciones de listas a listas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Bueno, hace muuuuuuucho tiempo escribí una función que inserta un nodo en una lista según un determinado campo siendo los campos otra lista...
Para explicar:

[attachment=8441]


La use 3 veces la función y nunca mas tuve la necesidad.. pero bueno por ahí a alguien le sirva..

Las comente para que se entienda que hace cada línea del código mas o menos sin que haga falta romperse la cabeza igual para mi se re entienden las funciones.
Creo que funcionan bien y seguramente se puedan hacer mas cortas pero se lo dejo a otro.



/**
* \file datos.h
* \brief Prototipos de funciones.
* \brief Defines y prototipos de las funciones sobre datos.
* \author Fernando
* \date 2014.02.10
* \version 1.0.0
*/

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

//-----------------
//---- Defines ----
//-----------------

#define MAX_NOM 50

//-----------------
//-- Estructuras --
//-----------------

struct DATO{

char nombre [MAX_NOM];
int edad;
char campo; //TODO Esta variable es la que me engancha a la lista con las listas derivadas
// De cada posición.

};

struct NODO_DATO{ //Estructura de datos almacenados al sistema.

struct DATO dato; //Estructura contenedora de datos del dato.
struct NODO_DATO* siguiente; //Apunta al siguiente dato.
};

struct NODO_CAMPO{

char campo; //Contiene letra identificatoria de campo.
struct NODO_DATO* sublista; //Puntero a lista dato.
struct NODO_CAMPO *siguiente; //Puntero a siguiente campo.
};


//-----------------
//-- Prototipes --
//-----------------

int nuevo_dato(struct DATO ,struct NODO_CAMPO**);
struct NODO_CAMPO* busca_inserta_campo(struct NODO_CAMPO** , char);
void agregar_dato(struct NODO_DATO** ,struct DATO);


/**
* \file nuevo_dato.c
* \fn int nuevo_dato(struct DATO dato,struct NODO_CAMPO **lista)
* \brief Función para agregar dato a lista.
* \author Fernando
* \date 2014.02.10
* \param dato - Dato a insertar.
* \param **lista - Puntero a la lista.
* \return 1 si el dato fue insertado a la lista.
*/

int nuevo_dato(struct DATO dato,struct NODO_CAMPO **lista){

struct NODO_CAMPO *campo;
campo = busca_inserta_campo(lista,dato.campo); //Busco en que campo de la lista voy a guardar el dato y devuelvo la direccion bloque
agregar_dato(&(campo->sublista),dato); //Agrego el dato a la sub-lista segun el campo al cual pertenezca.
return(1); //Dato insertado.

}


/**
\file busca_inserta_campo.c
\fn struct NODO_CAMPO* busca_inserta_campo(struct NODO_CAMPO** lista, char campo)
\brief Crea un nodo si no lo encuentra donde guarda un nuevo campo.
\author Fernando Pose
\date 2014.02.10
\param lista la direccion a donde apunta lista.
\param campo es el campo que busco (lista principal contenedora de sub-listas)
\return la funcion devuelve la direccion de memoria al campo que estoy buscando.
*/

struct NODO_CAMPO* busca_inserta_campo(struct NODO_CAMPO** lista, char campo){

struct NODO_CAMPO *aux; //Recorrer lista sin perder referencia de comienzo de lista.
struct NODO_CAMPO *nuevo; //Agregar nodo.

if(*lista == NULL){ //Si la lista esta vacia.. //Si flag esta en 1 entonces esta para insertar nuevos nodos.
nuevo = (struct NODO_CAMPO *) malloc(sizeof(struct NODO_CAMPO)); //Creo nuevo nodo.
nuevo->sublista = NULL; //Como nodo es nuevo no tiene sub-lista.
nuevo->campo = campo; //Le agrego campo al nuevo nodo.
nuevo->siguiente = NULL; //Apunto siguiente al NULL
*lista = nuevo; //Lo adjunto al principio de la lista.
return nuevo; //Devuelvo el nodo creado.
}
else{ //De lo contrario.
aux = *lista; //Guardo posicion lista para no perder el inicio de la misma.
while((aux != NULL) && (aux->campo!=campo)){ //Mientras no haya encontrado el campo y haya mas nodos miro el sig. nodo.
aux = aux->siguiente; //Me voy al siguiente nodo --> siguiente!!!:D
}
if(aux != NULL){ //Si encontro el campo
return(aux); //Retorno el nodo.
}
else{
nuevo = (struct NODO_CAMPO *) malloc(sizeof(struct NODO_CAMPO)); //Creo nuevo nodo.
nuevo->sublista = NULL; //Como nodo es nuevo no tiene sub-lista
nuevo->campo = campo; //Le agrego campo al nuevo nodo.
nuevo->siguiente = *lista; //Apunto siguiente al primer nodo
*lista = nuevo; //Lo pongo al principio de la lista.
return nuevo;
}
}
return(NULL);
}

/**
\file agregar_dato.c
\fn void agregar_dato(struct NODO_DATO** lista,struct DATO dato))
\brief Crea un nodo donde se agrega un nuevo dato.
\author Fernando
\date 2014.02.10
\param lista - Para moverme por la lista y agregar el dato.
\param dato - Dato a agregar al sistema.
*/

void agregar_dato(struct NODO_DATO** lista,struct DATO dato){

struct NODO_DATO *aux, *nuevo;

nuevo = (struct NODO_DATO *) malloc(sizeof(struct NODO_DATO)); //Creo nuevo nodo.
nuevo->dato = dato; //Cargo datos en nuevo nodo.
if(*lista == NULL){ //Si lista vacia entonces:
nuevo->siguiente = NULL; //Apunto siguiente al NULL
*lista = nuevo; //Lo adjunto al principio de la lista.
}
else{ //De lo contrario.
nuevo->siguiente = *lista; //Nodo nuevo apunta al comienzo de la lista.
*lista = nuevo; //Nuevo nodo queda al principio de la lista.
}
}


URLs de referencia