Tipo de dato abstracto Pila a void IV

Tipo de dato abstracto Pila a void IV

En ésta cuarta parte del tutorial, vamos a dedicarnos a ver cómo sacar un elemento del tipo de datos abstracto pila. Ya vimos en el artículo anterior, como se insertan datos en la pila, hemos visto los procedimientos constructor, destructor y la función pila vacía, o la declaración del fichero .h.

Vamos a ver primero el código y después lo comentaremos.

void p_saca ( pila p, void *e ) {
	
		struct p_ele* viejo;
		
		if ( !*p ) {
			fprintf ( stderr, "p_saca: La pila no existe.\n" );
			exit (1);
		}
		
		if ( p_vacia ( p ) ) {
			fprintf ( stderr, "p_saca: La pila está vacía.\n" );
			exit (1);
		}
		
		viejo = (( struct tpila*)p)->p;
		memcpy ( e, viejo->val, (( struct tpila*)p)->tam );
		(( struct tpila*)p)->p = viejo->sig;
		free ( viejo->val );
		free ( viejo );

}

Lo primero que vamos a hacer es comprobar si la pila existe -en la primera condicional- y si está vacía, en la segunda condicional. En caso de que se cumplan cualquiera de éstas dos condiciones, el procedimiento finalizará su ejecución y terminará la ejecución.

En caso contrario, utilizaremos una variable auxiliar para almacenar la dirección del primer elemento de la pila. A continuación, con el procedimiento memcpy recuperaremos el valor del dato almacenado en el nodo. Asignaremos el puntero a la cabecera de la pila en el siguiente elemento. Por último, liberaremos los recursos de memoria ocupados por el dato almacenado y por el nodo de la pila.

Con ésto hemos terminado. Quizás lo más complicado de éste código son los casteos que hay que realizar en el código. Una vez más, invito a mis lectores a que me dejen en la caja de comentarios sus impresiones o compartan código alternativo.

No Comments

Post a Comment