Tipo de dato abstracto Pila a void III

Tipo de dato abstracto Pila a void III

En ésta tercera parte de nuestra serie de tutoriales dedicados a implementar una pila con punteros a void, nos vamos a centrar en aprender cómo insertar un elemento en la pila.

En ésta ocasión, al contrario de ejemplos precedentes, será un poquito más complicado por que, a priori, no conocemos el elemento que contendrá la pila. Por lo tanto reservaremos la memoria necesaria con el campo que inicializamos en el constructor: tam.

Pero, no me alargaré demasiado en la explicación, el código habla por si mismo, y aquí lo tenemos:

void p_mete ( pila p, void *e ) {

	struct p_ele* nuevo;
	
	if ( !*p ) {
		fprintf ( stderr, "p_mete: La pila no existe.\n" );
		exit (1);
	}
	
	nuevo = (struct p_ele*) malloc (sizeof (struct p_ele ));
	if ( !nuevo ) {
		fprintf ( stderr, "p_mete: no hay suficiente memoria|n");
		exit(1);
	}
	
	nuevo->val ( void* ) malloc (( struct tpila*)p)->tam);
	if ( !nuevo->val ) {
		fprintf ( stderr, "p_mete: no hay suficiente memoria|n");
		exit(1);
	}

	memcpy ( nuevo->val, e, (( struct tpila*)p)->tam);
	nuevo->sig = (( struct tpila*)p)->p;
	(( struct tpila*)p)->p = nuevo;

}

En el código se han haciendo una serie de comprobaciones. En caso de que el resultado no sea el esperado, la opción exit, interrumpirá la ejecución del programa.

El primer paso es comprobar si la pila ha sido o no creada.

En caso afirmativo, reservaremos memoria para el nodo que contendrá el dato y el puntero al siguiente elemento. En caso de que no haya memoria suficiente, se saldrá del programa.

En el tercer paso, comprobamos si tenemos memoria suficiente para el elemento que contendrá el nodo, con los correspondientes casteos.

Por último, actualizaremos los campos usando para ello el procedimiento memcpy de c y asignando los valores del puntero adecuados.

Como siempre digo, para terminar el artículo, dejo la sección de contactos abierta por si algunos de mis lectores quiere dejar su opinión, su aportación o un código alternativo para el procedimiento insertar un elemento en la pila.

No Comments

Post a Comment