Estructuras de datos Antes de analizar la implementación de listas por medio de apuntadores es necesario hacer uso de cierta notación que nos será útil para comprender su comportamiento. En las siguientes láminas se muestra la representación gráfica de una estructura y la manera de usarla para construir una lista. Estructuras de datos Primero vamos a declarar una estructura llamada NODO. typedef struct{ int dato; NODO *siguiente; }NODO; NODO dato NODO *inicio, *nuevo; inicio = nuevo = NULL; siguiente Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos • La estructura la representamos gráficamente por medio de un rectángulo divido de la misma forma que los campos de la estructura. • Un apuntador lo representamos por medio de una flecha. • El nombre lo de la estructura la hemos puesto como etiqueta en la parte superior del rectángulo. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos Usando las declaraciones de los apuntadores inicio y nuevo haremos la implementación de nuestra lista por medio de apuntadores. Primero deberemos crear un nodo de manera dinámica: nuevo = (NODO *)malloc(sizeof(NODO)); Después es necesario asegurarse si la memoria fue asignada correctamente: Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos Después es necesario asegurarse si la memoria fue asignada correctamente: if (nuevo == NULL){ fprintf(stderror, “Memoria insuficiente\n”); exit(1); } nuevo inicio Cumplido el requisito anterior, ya podemos marcar el inicio y el final de la lista como: NULL inicio = nuevo; nuevo->siguiente = NULL; La siguiente lámina muestra el proceso de manera gráfica. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples 1 Estructuras de datos Estructuras de datos La inserción de un nuevo nodo requiere de una nueva llamada a malloc. if ((nuevo = (NODO *)malloc(sizeof(NODO))) == NULL) { fprintf(stderror, “Memoria insuficiente\n”); exit(1); } inicio NULL Para unir el nodo anterior con el nuevo nodo tenemos lo siguiente: inicio->siguiente = nuevo; nuevo->siguiente = NULL; Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos Estructuras de datos Una función inserta con el comportamiento anterior quedaría como sigue: Una función para eliminar un nodo quedaría como sigue: void inserta(NODO *L){ NODO *ultimo, *nuevo; if ((nuevo = (NODO *)malloc(sizeof(NODO))) == NULL) { fprintf(stderror, “Memoria insuficiente\n”); exit(1); } nuevo->siguiente = NULL; if ( L == NULL) L = nuevo; //Lista vacia else{//Lista no vacia while(ultimo->siguiente != NULL) ultimo = ultimo->siguiente; ultimo->siguiente = nuevo; } } void elimina(NODO *L){ NODO *ultimo = L; if ( L != NULL) { if (L ->siguiente == NULL) free(L); L = NULL; } else{ while(ultimo->siguiente->siguiente != NULL) ultimo = ultimo->siguiente; free(ultimo->siguiente); utimo->siguiente = NULL; } } Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos else{ fprintf(“Error la lista esta vacía\n”); exit(1); } Estructuras de datos Para la función inserta: } inicio En la siguiente lámina puede verse una representación gráfica del comportamiento de las dos funciones. nuevo NULL NULL ultimo Después de insertar: NULL inicio ultimo Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples 2 Estructuras de datos Para la función elimina: inicio NULL ultimo Después de eliminar: inicio NULL Estructuras de datos Resulta evidente que las cosas serían mas sencillas si tuviesemos un apuntador que en todo momento señalara el fin de la lista del mismo modo que existe uno que señala el inicio. Este enfoque es el que se usa comúnmente. Además se tienen las funciones llena y vacía que se tenían en el caso de la inmplementación con arreglos. ultimo Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples Estructuras de datos Tarea 3: Realizar el conjunto de operaciones con listas implementandolas con arreglos y con apuntadores. Tomar la lista de las láminas de modelo de listas. Entregar el sábado 16 de marzo. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Listas Listassimples simples 3