TDA Lista de enteros II

TDA Lista de enteros II

Pasamos al segundo artículo de esta serie de publicaciones en la que trataré de explicaros cómo se implementa una lista de enteros en c.

Ahora comenzaremos con la libreria principal implementando todas las funciones. Como dijimos anteriormente, ésta lista tendrá en su cabecera trs punteros apuntando al inicio, al final y a un nodo central de la lista. Esto facilitará muchísimo su manejo, aunque dificulta un poco más su programación.

Comenzamos con la inclusión de las librerias y la declaración de las variables:

struct l_ele {
	struct l_enteros valor;
	struct l_ele *sig;
};

typedef struct l_ele *l_lst;

struct l_dir {
	l_lst prim, nodo, ulti;
	int tam;
	int indnodo;
};

A continuación, vamos a implementar una serie de funciones auxiliares que nos serán útiles más tarde.

int l_iguales ( struct l_enteros a, struct l_enteros b ) {
	
	return ( a.x == b.x );
	
}

int l_menor ( struct l_enteros a, struct l_enteros b ) {
	
	return ( a.x < b.x );
	
}

int l_mayor ( struct l_enteros a, struct l_enteros b ) {
	
	return ( a.x > b.x );

}

La primera función de la estructura de datos -esencial- será el constructor. En nuestro caso será muy sencilla: se reserva memoria para el espacio que ocupará la cabecera de la lista y se actualizan los campos, esto es, los punteros a NULL y la variable que indica el tamaño de la lista a cero. Veamos:

lista lista_nueva ( ) {

	lista rep;
	
	rep = (struct l_dir *) malloc( sizeof ( struct l_dir ));
	if ( !rep ) {
		fprintf ( stderr, "lista_nueva: no hay memmoria suficiente\n" );
		exit ( 1);
	}
	
	rep->prim = rep->nodo = rep->ulti = NULL;
	rep->tam = rep->indnodo = 0;
	
	return ( rep );

}

Continuamos con la estructura. En esta ocasión, vamos a dedicar nuestra atención al destructor. Este procedimiento se usa para liberar el espacio que ocupa la lista en memoria y devolver estos resursos al sistema operativo.

En esta ocasión comprobamos si la lista existe. Si es así, entonces en un bucle que dará tantos ciclos como elementos tenga la lista iremos liberando la memoria de cada nodo.

Al final, liberaremos el espacio que ocupa la cabecera en memoria y asignaremos a los punteros el valor NULL.

void lista_dest ( lista *c ) {
	
	l_lst viejo, corr;
	int i; //contador;
	
	if ( !*c ) {
		fprintf ( stderr, "lista_dest: la lista no existe\n" );
		exit ( 1);
	}
	
	cor = (*c)->prim;
	for ( I=1; i<=(*c)->tam; i++ ) {
		viejo = corr;
		corr=corr->sig;
		free ( viejo );
	}
	
	free ( *c );
	*c = NULL;
		
}

Para terminar éste artículo, vamos a crear una función auxiliar -otra más- que nos servirá para saber si la lista está o no vacía. Es un código que reutilizaremos a menudo y que no vale la pena repetir en la libreria que estamos construyendo.

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

Continuaremos los próximos días con ésta librería. Os dejo la sección de comentarios abierta para que podáis dejarme vuestras opiniones.

No Comments

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.