Hola, dado que la mayoria de los programadores trabajamos mucho con estructuras de datos dinámicas (sobre todo para las practicas de la universidad), me he propuesto crear una serie de implementaciones "genericas" para las estructura de datos dinamicas mas comunes.
He empezado por la implementación de una pila, pues es la más facil en cuanto a funciones a utilizar. El siguiente código administra el uso de una serie de pilas que el usuario puede crear.
El codigo funciona, al menos en las pruebas que he realizado, os invito a probarlo si quereis.
Pero sobre todo, me gustaria que le echarais un vistazo, no solo a la implementación, sino tambien a las funciones principales que facilita esta "mini-libreria". ¿Os resultan suficientes? Si fuerais vosotros los que usarais esta implementación, ¿añadiriais alguna función mas?.
Aqui os lo pongo:
Archivo pila.h
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
/* IMPLEMENTACION DE UNA PILA "GENERICA"
* --------------------------------------------------------
*
* La siguiente implementacion permite el uso de una pila lo mas generica
* posible. Existe una estructra nodo que almacena un puntero a la
* informacion que desea introducirse a la pila. La varaible **pilas almacena
* las pilas que estan siendo usadas.
* La funcion creaPila() devuelve un entero para el acceso a la pila creada
* que sera usado en las demas funciones. El uso del entero puede asemejarse a
* un descriptor de archivos.
*/ #include <stdio.h>/* Estructura que actuara como NODO */struct nodo {
/* Elemento a almacenar */ void *elem;
/* Puntero al elemento siguiente */ struct nodo *sig;
};
/* Puntero a las pilas que estan siendo utilizadas */struct nodo **pilas;
/* Crea una pila. Devuelve el entero para controlarla */int creaPila();
/* Introduce un elemento en la pila especificada */void apila(
int pila,
void *elemento);
/* Desapila un elemento de la pila especificada */void *desapila(
int pila);
/* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera(
int pila);
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Archivo pila.c
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
/* Implementacion de una pila generica
*/#include "pila.h"/* Crea una pila. Devuelve el entero para controlarla */int creaPila(){
static int num_pilas =
0;
struct nodo **aux;
int i;
aux = (
struct nodo **) malloc(
sizeof(
struct nodo *)*num_pilas);
for(i =
0; i < num_pilas; i++)
aux[i] = pilas[i];
num_pilas++;
pilas = (
struct nodo **) malloc(
sizeof(
struct nodo *)*num_pilas);
for(i =
0; i < num_pilas -
1; i++)
pilas[i] = aux[i];
pilas[num_pilas-
1] = NULL;
return num_pilas-
1;
}
/* Introduce un elemento en la pila especificada */void apila(
int pila,
void *elemento) {
struct nodo *aux;
aux = (
struct nodo *) malloc(
sizeof(
struct nodo));
aux->elem = elemento;
aux->sig = pilas[pila];
pilas[pila] = aux;
}
/* Desapila un elemento de la pila especificada */void *desapila(
int pila) {
void *aux;
struct nodo *act;
if(pilas[pila] == NULL)
return NULL;
aux = pilas[pila]->elem;
act = pilas[pila];
pilas[pila] = pilas[pila]->sig;
free(act);
return aux;
}
/* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera(
int pila) {
return pilas[pila]->elem;
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Como veis, la implementación intento que sea genérica utilizando punteros a void. Pero usando C, esa "genericidad" es un poco superficial, pues además acarrea otros problemas como es la uniformidad de los datos que contiene la pila. Esto podría llevarnos a largas disertaciones acerca de la reutilización, modularidad y demás del lenguaje C y de mi implementación, pero no pretendo ir por esos derroteros (aunque si alguno se presta, que no dude en comunicarmelo

).
La implementacion es sencilla y corta, y solo quiero saber vuestra opinion acerca de su utilidad y cosas que podrían faltar y demás. Por supuesto, si detectais algun error, no dudeis en comunicarmelo.
Muchas gracias!
Nos vemos