Copiar una pila de enteros

Copiar una pila de enteros

Con éste artículo terminaremos la serie del tipo de dato abstracto pila de enteros. Recordando un poco, comenzamos con el articulo: tda pila de enteros, seguimos explicando como se codificaban el constructor de tda, el destructor y alguna función auxiliar : pila de enteros. iniciamos la estructura de datos. Dedicamos un tiempo a ver como se insertaban elementos en la pila y cómo se sacaban elementos de ella. Para terminar éste tutorial, vamos a aprender a hacer una copia de la pila de enteros.

Como siempre, lo primero que haré será listar mi propuesta de código y despues hablaré un poco sobre ella:

p_enteros pila_int_copiar ( p_enteros p ) {
	
	p_enteros b, corr, nuevo;
	
	b = NULL;
	
	if ( p ) {
		nuevo = ( struct p_enteros_ele* ) malloc ( struct p_enteros_ele ));
		if ( !nuevo ) {
			fprintf ( stderr, "p_enteros_copiar: No hay memoria suficiente.\n" );
			exit (1);
		}
		
		nuevo->val = p->val;
		b = corr = nuevo;
		p = p->sig;
		
		while (p) {
			nuevo = ( struct p_enteros_ele* ) malloc ( struct p_enteros_ele )); 
			if ( !nuevo ) {
				fprintf ( stderr, "p_enteros_copiar: No hay memoria suficiente.\n" );
				exit (1);
			}
		
			nuevo->val = p->val;
			corr = corr->sig = nuevo;
			p = p->sig;
		}
		
		corr->sig = NULL;
		
	}
	
	return (b);
	
}

El proceso que he seguido ha sido, como siempre, lo más sencillo y didáctico posible. Comenzamos por comprobar si la pila tiene elementos. En caso contrario, evidentemente, hemos terminado.

En caso afirmativo, reservaremos memoria para el primer elementos y actualizaremos los punteros, evidentemente previa comprobación que hay memoria suficiente para éste primer elemento.

La siguiente fase del algoritmo es obvia: en un bucle while, iremos añadiend los sucesivos elementos de la pila que pretendemos copiar hasta que nos encontremos un puntero apuntando a NULL, indicativo de que ya hemos terminado de copiar la pila.

Si no se ha presentado algún error mientras reservabamos memoria para los sucesivos elementos, sólo nos queda devolver la pila.

Como siempre estoy haciendo con éstos tutoriales, invito a los que leen éste artículo a que propongan sus alternativas y las compartan con la comunidad de programadores.

No Comments

Post a Comment