Cada nodo de la lista está formado por :
- Un elemento del tipo deseado, en nuestro caso unsigned.
- Un puntero al próximo nodo, o null si es el último.
Por tanto cada nodo estará definido así.
typedef struct TNodo * TLista; // defino el tipo TLista, que es un puntero a un registro struct TNodo { unsigned valor; TLista sig; };
Como vemos, hay dos elementos en el registro:
- Un elemento llamado valor de tipo natural.
- Un puntero al próximo nodo, pues TLista es un puntero a un nodo.
El ejercicio nos pide crear los siguientes métodos:
void crear (TLista * lista); // Crear lista vacia void rellenar(TLista * lista); // Incluir elementos en la lista (pedir numeros hasta que se inserte un negativo) y que los elementos se inserten por el principio void destruir(TLista* lista); // Destruir todos los elementos de la lista void mostrar (TLista lista); // Mostrar los elementos de la listaPasamos a ver cada uno de los métodos:
Crear: Simplemente hacemos que el puntero apunte a NULL.
void crear (TLista * lista){ // Crear lista vacia *lista = NULL; }Rellenar: Mientras los números que introduzcamos sean positivos, creamos un auxiliar con el valor del número introducido cuyo siguiente sea el resto de la lista y posteriormente hacemos que la lista apunte a dicho auxiliar.
void rellenar(TLista * lista){ int insertado; TLista auxiliar; printf("Introduce los números de la lista (introducir un número negativo para finalizar): \n"); fflush(stdout); scanf("%d", &insertado); while (insertado >= 0) { auxiliar = malloc(sizeof(struct TNodo)); auxiliar->valor=insertado; auxiliar->sig=*lista; *lista=auxiliar; scanf("%d", &insertado); } }Destruir: Añado dos formas distintas de hacerlo. En ambas se necesita un auxiliar para recorres dicha lista e ir eliminando los nodos, liberando memoria mediante el método free.
void destruir(TLista* lista){// Destruir todos los elementos de la lista TLista auxiliar; while (*lista != NULL) { auxiliar=(*lista)->sig; free(*lista); *lista=auxiliar; } /* TLista ptr = *lista; while(ptr != NULL){ *lista = ptr-> sig; free( ptr); ptr = *lista; } */ }Mostrar: Simplemente recorremos la lista mostrando los valores de los nodos.
void mostrar (TLista lista){// Mostrar los elementos de la lista TLista ptr = lista; printf("["); while (ptr != NULL) { printf("%u", ptr->valor); ptr = ptr->sig; if (ptr != NULL) { printf(", "); } } printf("]\n"); }Posteriormente en otra entrada completaré el ejercicio agregando otros métodos como:
int is_empty(Linked_List l); // Devuelve verdadero si la lista está vacía int contains(Linked_List l, unsigned v); // Devuelve verdadero si la lista contiene el elemento v int length(Linked_List l); // Devuelve el número de elementos de la lista int insert(Linked_List * ptrL, int pos, unsigned v); // Inserta v en la posición pos de la lista (*prtL). Si ok, devuelve verdadero; si pos no está entre 1 y length +1, entonces devuelve falso int remove(Linked_List * ptrL, int pos); // Borra el elemento pos de la lista, devolviendo verdadero o falso según la operación se pueda realizar. int getElement(Linked_List l, int pos); // Devuelve el elemento de la posición pos. Si esa posición no existe, el comportamiento de la función no está definido. Linked_List readFromFile(char * filename); // Asumiendo que filename contiene N líneas, donde cada línea es un entero, lee el fichero y almacena su contenido una lista que es devuelta como resultado. En caso de alguna situación de error, la función devolverá NULL. int writeToFile(Linked_list list, char * filename); // Escribe el contenido de la lista list en el fichero denominado filaneme, almacenando cada elemento de la lista una línea del fichero. La función devuelve verdadero o falso según se haya realizado con éxito o no
Un saludo ;)
No hay comentarios:
Publicar un comentario