TDA Lista de enteros V

TDA Lista de enteros V

En este capítulo de mi pequeño tutorial vamos a ver cómo se copia la lista de enteros. Voy a mostrar dos procedimientos. El primero copiará un segmento de la lista. El segundo copiará la lista entera haciendo una llamada al primer procedimiento.

Vamos a comenzar con el código fuente en c de la función que copia un segmento de la lista de enteros que estamos tratando:

lista lista_copyseg ( lista c, int ini, int fin ) {
	
	lista b;
	int i;
	l_lst aux;
	
	if ( !c ) {
		fprintf ( stderr, "lista_copyseg: la lista no existe\n" );
		exit ( 1);
	}
	
	if ((ini<1) || (fin>c->tam) || (fin<ini)) {
	
		fprintf ( stderr, "lista_copyseg: parámetros erroneos\n" );
		exit ( 1);
	
	}
	
	b = lista_nueva ();
	
	aux = c->nodo;
	l_marc ( c, ini );
	lista_mete (b, c->nodo->val, L_IZQ);
	for ( i = ini; i<=fin; i++ ) {
		l_next ( c );
		lista_mete (b, c->nodo->val, L_MED);
	}	
	
	b->nodo=b->prim;
	b->indnodo =  1;
	b->tam=fin-ini+1;
	c->nodo=aux;
	
	return b;
	
}

La función en si es bastante sencilla. Lo primero que tenemos que comprobar es si la lista que queremos copiar existe y que los parámetros que le pasamos como argumento son correctos. En caso contrario salimos.

El segundo y tercer parámetro indicarán desde donde hasta donde queremos copiar la lista.

Realmente no hay mucho que decir: reservamos memoria para las cabeceras de la nueva lista y el un bucle for iremos insertando uno a uno los elementos de la lista que sean necesario.

El final, como es obvio, devolver la lista copiada. Fácil ¿no?. Pasemos ahora a la función que copia la lista completa. ¿Que es lo que debemos hacer?: pues copiar la lista desde el primer nodo hasta el último nodo, que serán precisamente los valores que se le darán a los argumentos de la función que ya hemos comentado arriba.

Así pues, aquí está el código fuente:

lista lista_copy ( lista c ) {
	
	if ( !c ) {
		fprintf ( stderr, "lista_copy: la lista no existe\n" );
		exit ( 1);
	}
	
	return (lista_copyseg(c, 1, c->tam));
	
}

Como siempre, tenéis abierta la sección de comentarios para dejar vuestras aportaciones o códigos fuente alternativos.

No Comments

Post a Comment