Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD DE GUADALAJARA CENTRO UNIVESITARIO DE CIENCIAS EXACTAS E INGENIERIAS REPORTE 01: “Lista Simplemente Ligada” MATERIA Y SECCIÒN: Estructuras de Datos II D01 PROFESOR: Noé Ortega Sánchez ALUMNO: Moisés de Jesús Zaragoza Jiménez CÒDIGO: 213744319 CARRERA: INNI PROGRAMA 1: LISTA SIMPLEMENTE LIGADA En esta ocasión como primer programa tocó implementar una lista simplemente ligada, recordemos que este TDA se basa principalmente en el almacenamiento de datos contiguamente ligados, es decir, uno después de otro, sabiendo que cada dato tiene acceso a la dirección del siguiente dato, comenzando por un ancla y terminando con un apuntador a nulo. En esta ocasión opté por codiciar mis nodos a partir de apuntadores inteligentes, estos punteros se caracterizan por optimizar código y recursos ya que tienen la capacidad de liberarse de la memoria dinámica automáticamente al detectar que no son apuntados por nadie. También cabe mencionar que codifiqué mi lista a partir de templates o de plantillas lo que me facilita y garantiza que puedo usar cualquier tipo de dato, inclusive puedo usar objetos, como lo requiere este programa en donde me decidí por manejar una lista de vehiculos. A continuación, mostraré una breve descripción de cada parte que conforma mi actividad y terminaré con las capturas de funcionamiento. CLASE NODO Mi clase nodo la anidé dentro de mi clase lista en el apartado privado, mi clase nodo cuenta con un campo para dato, y ya que hablamos de una lista simplemente ligada también cuenta con su apuntador a siguiente, como mencionaba en la introducción me basé en utilizar apuntadores inteligentes para la optimización de recursos. También cuenta con su constructor en donde me aseguro de que el nodo se encuentre vacío y listo para utilizarse, apuntando el ancla a nulo, dejando listo el campo de dato para un elemento y apuntando el siguiente al ancla. CLASE LISTA En mi clase lista declaro todos mis métodos de operaciones que puede realizar una lista, comenzando por el constructor que me ayuda a dejar preparada la lista para utilizarse, asegurándose de que está vacío, seguido de su destructor que me ayuda llamando al método de borrar todo que veremos a continuación, en seguida declaro de forma pública todos mis métodos de operaciones que van desde saber si mi lista está vacía, saber el tamaño de elementos que contiene, agregar, eliminar, obtener primer y último elemento, borrar todo, etc.. que veremos cada uno de ellos a continuación. VACIA Si el tamaño de mi lista es igual a 0 regresamos un booleano que indica que en efecto, la lista se encuentra vacía. SIZE Devuelve el valor de un contador que aumenta 1 cada que se agrega un elemento a la lista y disminuye 1 cada que un elemento es eliminado. AGREGAR INICIO Revisamos si la lista se encuentra vacía, si es así nuestro primer elemento también será el último, si la lista ya cuenta con posiciones creamos un nuevo nodo al que asignaremos el elemento recibido, después haremos que el ancla apunte a este en la posición en donde se encontraba el primer nodo originalmente. Aumentamos en 1 el contador de elementos de la lista. AGREGAR FINAL Revisamos si la lista se encuentra vacía, si es el caso creamos el nodo con el elemento y el ultimo nodo también sería el primero, si no se encuentra vacía colocamos este nuevo nodo con el elemento recibido en la posición siguiente del ultimo nodo original, aumentamos nuestro contador de elementos. OBTENER PRIMER ELEMENTO Validamos que la lista no se encuentra vacía y regresamos el dato del primer nodo. OBTENER ULTIMO ELEMENTO Validamos que la lista no se encuentre vacía y regresamos el dato del último nodo. ELIMINAR PRIMERO Primero revisamos si la lista se encuentra vacía, en ese caso no es posible hacer una eliminación, después verificamos si la lista solo cuenta con un elemento, si es así el primero y el último apuntarán a nulo, sino solamente apuntamos el primero al siguiente del que era el primero, los punteros inteligentes nos ayudan a liberar este espacio de memoria automáticamente, disminuimos el contador de elementos. ELIMINAR ULTIMO Primero revisamos si la lista se encuentra vacía, en ese caso no es posible hacer una eliminación, después verificamos si la lista solo cuenta con un elemento, si es así el primero y el último apuntarán a nulo, sino crearemos un nodo auxiliar que comience en el primer nodo y vaya avanzando al siguiente hasta que sea el penúltimo, cuando sabemos que nuestro auxiliar se encuentra en el penúltimo nodo solo eliminamos el siguiente del auxilia e igualamos como nuevo ultimo a este auxiliar, los punteros inteligentes nos ayudan a liberar este espacio de memoria automáticamente, disminuimos el contador de elementos. AGREGAR EN POSICION EN ESPECIFICO Recibimos una posición y en elemento, si la posición es mayor al tamaño de la lista o la lista se encuentra vacía no podremos agregar el elemento, si la posición es igual a 0 solo hacemos un agregar a inicio el elemento recibido, si la posición es igual al tamaño de la lista solo hacemos un agregar final, si la posición se encuentra dentro del tamaño de la lista creamos un nodo auxiliar que nos ayude con un recorrido y en donde se encuentre la posición ahí insertaremos este nodo auxiliar con el elemento recibido, aumentamos contador de elementos. ELIMINAR POSICION Recibimos una posición, si la posición es mayor al tamaño de la lista o la lista se encuentra vacía no podremos eliminar el nodo, si la posición es igual a 0 solo hacemos un eliminar primero, si la posición es igual al tamaño de la lista solo hacemos un eliminar final, si la posición se encuentra dentro del tamaño de la lista creamos un nodo auxiliar que nos ayude con un recorrido y en donde se encuentre la posición ahí eliminaremos este nodo auxiliar, disminuimos el contador de elementos. ELIMINAR TODA LA LISTA Solamente hacemos un eliminar inicio, los punteros inteligentes nos ayudaràn a liberar todo el espacio de memoria utilizado por nuestra lista, el primero y ultimo apuntarían de nuevo a nulo y nuestro contador sería igual a 0. CLASE VEHICULO Tenemos nuestra clase de Vehiculo que serà la encargada de llenar el campo de elemento o de dato de nuestros nodos, esta clase cuenta con sus 3 atributos que son el Model del auto, el año y el color, cuenta con sus getters y setters y añadì 2 sobrecarga de operadores, el ostream que nos ayuda a imprimir con >> y el istream que nos ayudarà a cargar los datos cada que queramos insertar un nuevo elemento tan solo con >>. Posteriormente mostrarè una clase administradora en donde manipule mis mètodos de lista con mis atributos y mètodos de mi clase de elementos, es decir, mi clase de los vehiculos. El setw nos ayudarà a imprimir con una separaciòn entre cada campo pareciendo una especie de tabla ayudàndonos a tener una mejor organizaciòn. CLASE AGENCIA Esta agencia serà mi clase administradora o mi clase puente que conectarà los mètodos de mi lista con los atributos y mètodos de mi elemento Vehiculo, creando en mi apartado de atributos una Lista de objetos Vehiculo llamada vehiculos, ademàs de que a partir de aquì agregarè 2 nuevas operaciones, cargar y guardar archivos, utilizarè una sobrecarga de operadores para insertar que me serà de mucha ayuda en mi operaciòn de guardar, a continuaciòn explicarè còmo funcionarà cada uno de sus mètodos. Implementando un menu de operaciones en el misma clase agencia, para hacer uso de cada una de las acciones de la lista. AGREGAR INICIO Y FINAL Por parte del usuario recibiremos un Vehiculo y mandamos a llamar nuestro mètodo de agregar inicioo final. AGREGAR EN POSICION Recibiremos del usuario una posicion y un Vehiculo, revisamos el estado de la lista para asegurar que nuestro Vehiculo serà insertado en la posiciòn correcta. ELIMINAR PRIMERO Y ELIMINAR FINAL Solamente revisaremos si nuestra lista se encuentra o no vacía y mandaremos a llamar el método de eliminar inicio o eliminar final, depende el caso. ELIMINAR EN POSICION Recibimos del usuario una posición, revisamos si la lista no se encuentra vacía y si la posición recibida no sobrepasa el rango de la lista y mandamos a llamar el método de eliminar por posición mandando la posición recibida por el usuario. BORRAR TODO Revisamos si la lista no se encuentra vacía y mandamos a llamar el método de eliminar toda la lista. OBTENER PRIMERO O ULTIMO Revisamos si la lista no se encuentra vacía, con el setw nos ayudarà a mostrar el elemento en tipo tabla, nos ayuda a organizar los datos, y ahora sí mandamos a llamar el método de obtener el primero o último dependiendo el caso que haya seleccionado el usuario TAMAÑO DE LA LISTA Retorna el valor del contador que lleva el método size de nuestra lista. MOSTRAR LISTA(IMPRIMIR) Con ayuda del set crearemos un encabezado de tipo tabla, después crearemos un recorrido de toda nuestra lista en donde con la ayuda de nuestra sobrecarga de operador << imprimiremos el elemento de cada posición hasta completar toda nuestra lista. MENU DE OPCIONES En la misma clase agencia hice el menú de operaciones para hacer uso de todas las acciones de la lista, ya solo en el main lo llamo, creando un objeto agencia a, y vehículo v, usando switch case. METODO GUARDAR La estrategia que utilicé para codificar mi método de guardar fue primeramente con mi palabra reservada ofstream que nos ayuda a crear un archivo, en este caso un .txt al que nombramos file01.txt tal como lo pide la actividad, después con una condición evaluamos si el archivo se pudo abrir, es decir, se pudo crear correctamente, entonces hacemos un recorrido del tamaño de nuestra lista, creando un objeto de tipo Vehículo que se copie al elemento que estamos recorriendo, con nuestra sobrecarga de operador << iremos extrayendo atributo por atributo de nuestro Vehículo, cuidando siempre utilizar “|” para delimitar nuestros campos y “*” para delimitar nuestro registro y podamos seguir a la siguiente posición, como buena práctica de programación al final cerraremos el archivo indicando que hemos terminado el guardado METODO CARGAR Con la ayuda de nuestra palabra reservada ifstream nos ayudarà a abrir archivos, en este caso el file01.txt, primero revisamos si el archivo pudo ser abierto correctamente, en ese caso comenzaremos creando un objeto de tipo Vehiculo para almacenar los atributos que vayamos leyendo y una variable temporal string que nos ayudará como un auxiliar para guardar los datos leídos, con nuestro getline iremos leyendo línea por línea en el orden en que las guardamos, comenzando por modelo, siguiendo por año y terminando por color, con la ayuda de nuestros setters de nuestra clase Vehiculo iremos almacenando los datos leídos hasta llegar al delimitador, con el “stoi” nos ayuda a convertir el string leído en el archivo a un entero para poder almacenarlo en nuestro setter, una vez obtenidos los 3 atributos con un agregar final mandamos el objeto en donde cargamos lo leído, al final como buena práctica de programación cerraremos el archivo abierto. MAIN Ya únicamente en main creo un objetos tipo agencia y mando llamar el menú creado en la misma agencia. CAPTURAS DE FUNCIONAMIENTO Trabajaremos nuestra lista a partir de este menú de operaciones Agregué algunos elementos a nuestra lista para mostrar el correcto funcionamiento de las operaciones ahora sí. Podemos observar como nuestra lista se organiza como si fuese una tabla gracias al setw Agregar al Inicio Agregamos el Vehiculo “sentra” al inicio y vemos como la lista se actualiza de forma correcta. Agregar al Final Agregamos el Vehiculo “fit” al final y vemos como la lista se actualiza de forma correcta. Agregar en posición Agregamos el vehiculo “yaris” en la posición 3 de nuestra lista y vemos como se actualiza correctamente Obtener Primero Obtenemos el primer elemento de nuestra lista, que es “sentra” Obtener Ultimo Obtenemos el último elemento de nuestra lista, que es “fit” Eliminar Primero Eliminamos el primer elemento de nuestra lista que correspondía a “sentra” Eliminar Ultimo Eliminamos el último elemento de nuestra lista que correspondía a “fit” Eliminar en Posición Pregunta qué posición desea eliminar y elegimos eliminar la 2 que correspondía a “yaris” Guardar Lista Guardamos los elementos con los que cuenta la lista en un archivo .txt llamado file01, cuidando de guardar con delimitadores de campo y de registros, anexo una captura del archivo creado Cargar Lista Cerré mi compilador para volverlo a ejecutar y obtener una lista vacía, enseguida cargo archivo y obtengo los registros. BIBLIOGRAFÌA ¿Como guardar y cargar un árbol binario en un archivo? (2017, 16 noviembre). Stack Overflow en español. https://es.stackoverflow.com/questions/118012/como-guardar-y-cargar-un-arbol- binario-en-un-archivos Eliminar toda la lista Eliminamos todos los elementos de la lista y la dejamos vacìa
Compartir