Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Ejercicio resuelto] Funciones de listas a listas
Autor Mensaje
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.626
Agradecimientos dados: 604
Agradecimientos: 2.625 en 428 posts
Registro en: Apr 2010
Mensaje: #1
[Ejercicio resuelto] Funciones de listas a listas Apuntes y Guias Informática I (Electrónica)
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:

   


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.
}
}



[Imagen: digitalizartransparent.png]
10-03-2014 00:14
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Feer recibio 1 Gracias por este post
Santi Aguito (10-03-2014)
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.