Estructuras dinámicas de datos, TAD Lista, parte 2

Slides:



Advertisements
Presentaciones similares
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
Advertisements

TDA LISTA ESTRUCTURAS DE DATOS.
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
Tipos de Datos Abstractos (III) Clase #23 Introducción a la Programación.
Programación II Listas
Estructuras de datos y algoritmos
Estructura de Datos En C++
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Programación y Estructuras de Datos
Programación, Algoritmos y Estructuras de Datos
7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
9A9A9A9A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
Implementación de listas
Implementación de Listas
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Colas y Listas Enlazadas
ÁRBOLES DE EXPRESION.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
L ISTAS E NLAZADAS No son mas que un conjunto o lista de objetos que a diferencia de los vectores, estas poseen la capacidad de crecer o decrecer. Por.
COLAS, IMPLEMENTACIÓN A PARTIR DE LISTAS Y PARA PILAS
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
Listas circulares.
Tema 9 Estructuras.
Semana 5 Subprogramas..
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Archivos.
Estructuras.
Estructura de Datos y Algoritmos
Árboles binarios de búsqueda
Listas enlazadas.
Programación I Técnico Universitario en Web Dpto. de Informática FCFMyN - UNSL -11-
El lenguaje de programación C - Identificadores y variables – Isidro González Caballero ( Introducción.
ARBOLES ESTRUCTURAS DE DATOS.
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.
Estructuras de Datos Dinámicas: Listas Programación I Departamento de Informática Universidad Nacional de San Luis Argentina 2014.
Pilas y Colas Estructuras de Datos.
Archivos Programación I MC Beatriz Beltrán Martínez.
Árboles Binarios Estructuras de Datos.
LISTA DOBLEMENTE ENLAZADA
Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.
Árboles de Búsqueda Binaria
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
Informática Ingeniería en Electrónica y Automática Industrial
Universitarios: Ricardo Gonzales Jimenez Wilfredo Coca Reinaldo Yohan Docente: Lic. Israel Torrez Valverde Tema: Listas doblemente Enlazadas.
Memoria estática versus dinámica con Estructuras
Programación en C para electrónicos
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
PUNTEROS Y REFERENCIAS
Diseño de Algoritmos. Curso J.L. Leiva O. TEMA3TEMA3 TEMA3TEMA3 Estructuras Dinámicas Contenido del Tema Profesor: José Luis Leiva Olivencia. Despacho:
Unidad 4: LISTAS.
Punteros, referencias Listas enlazadas Arboles
Estructuras de datos Fundamentos de análisis y diseño de algoritmos.
INSTITUTO TECNOLOGICO DE APIZACO
Algoritmos y Estructuras de datos Listas Doblemente enlazadas
LENGUAJE “C” Programación.
Ayudantia 3: Pilas- Colas
Listas. Utilización de un TAD Lista. Interfaz del TAD LISTA public interface Lista { void crearNodo (); /*Crea un nuevo nodo en el TadLista*/ int devolverClave.
M.C. Meliza Contreras González
Laboratorio de programación
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
MEMORIA DINÁMICA.
PUNTEROS. Los punteros son de amplia utilización en programación y muchos lenguajes permiten la manipulación directa o indirecta de los mismos. Su razón.
Listas Dinámicas.
Tema 1. Estructuras de datos Objetivo: Objetivo: El alumno resolverá problemas de almacenamiento, recuperación y ordenamiento de datos y las técnicas de.
UNIDAD 8 Lista Enlazada: Eliminar Deseamos eliminar un elemento llamado elem de la lista enlazada. Es posible que la variable ini sea modificada. main(){
1 ListaUna Lista se define como una serie de N elementos E 1, E 2,..., E N, ordenados de manera consecutiva, es decir, el elemento E k (que se denomina.
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: LISTAS.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Transcripción de la presentación:

Estructuras dinámicas de datos, TAD Lista, parte 2 Estructura de Datos Estructuras dinámicas de datos, TAD Lista, parte 2

Ejemplos de Implementación de listas en C

Listas, Observaciones El uso de un puntero de cabecera (o estructura de cabecera), también llamado centinela, permite solucionar algunos problemas que se pueden dar al querer implementar la lista sin este elemento. Problemas que se generan al implementar funciones como eliminar o insertar nodos de una lista. Eliminar/insertar nodos al principio de la lista estaría cambiando constantemente el inicio de la lista. Eliminar: se corre el riesgo de perder la lista completa de estar mal implementado. Se recomienda utilizar una rutina que retorne la posición del nodo anterior y si se trata del primer nodo, se retorna la posición de la cabecera. Se recomienda trabajar: Archivos .h para las estructuras de lista, posición y los prototipos de funciones. Archivos .c para la definición de funciones y función principal.

Listas, Ejemplo 2 Struct Nodo; Typedef struct Nodo *PtrAlNodo; Lista enlazada simple, (izquierda archivo.h). Algunas funciones Struct Nodo; Typedef struct Nodo *PtrAlNodo; Typedef PtrAlNodo Lista; Typedef PtrAlNodo Posicion; Lista CrearVacia(Lista L); Int EstaVacia(Lista L) Int EsUltimo( Posicion P, Lista L); Posicion Buscar( tipoDato X, Lista L); void Eliminar( tipoDato X, Lista L); Posicion BuscarAnterior( tipoDato X, Lista L); void Insertar(tipoDato X, Lista L, Posicion P); void EliminarLista(Lista L); Posicion Cabecera(Lista L); Posicion Primero(Lista L); Posicion Avanzar(Posición P);

Listas, Ejemplo 2 Lista enlazada simple, (izquierda archivo.h). Algunas funciones Struct Nodo { tipoDato elemento; Posicion sig; }; /* sirve para testear si la lista está vacía retorna true si L está vacía */ Int EstaVacia(Lista L) { return Lsig ==NULL; }

Listas, Ejemplo 2 Lista enlazada simple, (izquierda archivo.h). Algunas funciones Ejercicio propuesto: mejorar las funciones del ejemplo (manejo de errores) /* retorna true si P es el último elemento de la lista L */ Int EsUltimo( Posicion P) { return P sig==NULL; } /* Retorna la posicion de X en L y Nulo si no lo encuentra*/ Posicion Buscar( tipoDato X, Lista L) Posicion P; /*1*/ P = Lsig; /*2*/ while( P!=NULL && P->Elemento !=X) /*3*/ P=P sig; /*4*/ return P; //qué pasa si X no existe?

Listas, Ejemplo 2 /* Eliminar el primer elemento X de la lista*/ Void Eliminar( tipoDato X, Lista L) { Posicion P, Tmp; P = BuscarAnterior( X, L); if (!EsUltimo(P,L)) Tmp = Psig; Psig = Tmpsig; free(Tmp); } Posicion BuscarAnterior( tipoDato X, Lista L) { Posicion P; /*1*/ P = L; /*2*/ while( Psig!=NULL && P->sigElemento !=X) /*3*/ P=P sig; /*4*/ return P; }

Listas, Ejemplo 2 /* Insertar después de posición P válida*/ Void Insertar( tipoDato X, Lista L, Posicion P) { Posicion Tmp; /*1*/ Tmp = malloc(sizeof(struct Nodo)); /*2*/ if (Tmp==NULL) /*3*/ Printf(“Error, sin espacio”); /*4*/ Tmp  Elemento = X; //esto está bien? /*5*/ Tmp  sig = P sig; /*6*/ P sig =Tmp; /*si P es NULL, esto es ilegal. estamos asumiendo que P está bien.*/ }

Listas, Errores Memory access violation / Segmentation violation Indica que la variable puntero contiene una dirección desconocida. Aparecen en general cuando: Se eliminan nodos que no existen, por ejemplo llamar dos veces a la función eliminar sobre el mismo puntero. Caso típico: Eliminar la lista completa.

Listas, Ejemplo de Error Void eliminarLista( Lista L ) { Posicion P; P=Lsig; Lsig=NULL; while( P != NULL) free(p); P = P  sig; } Void eliminarLista( Lista L ) { Posicion P, Tmp; P=Lsig; Lsig=NULL; while( P != NULL) Tmp = P  sig; free(p); P = Tmp; } /* Indicar el motivo por el cual el primer caso está mal implementado */

Lista doblemente enlazada, Ejemplo 3 Utilizaremos una cabecera con los siguientes elementos: Longitud. Primero. Último. Ventana  sería el lugar de la secuencia sobre el cual se van a realizar las operaciones que se apliquen al objeto abstracto. Typedef Struct ListaNodo { tipoDato info; struct ListaNodo *ant, *sig; } *pListaNodo; Typedef Struct { pListaNodo primero, ultimo, ventana; int longitud; } Tlista, *Lista; Typedef pListaNodo Ventana; //para almacenar la ventana de la lista

Lista doblemente enlazada, Ejemplo 3 Lista inicLista (void) { Lista resp; resp = (Lista)malloc(sizeof(Tlista)); resp  primero = resp  ultimo = resp  ventana = NULL; resp  longitud =0; return resp; }

Lista doblemente enlazada, Ejemplo 3 Void aLista (Lista L, tipoDato elem){ pListaNodo nuevo=(pListaNodo)malloc(sizeof(struct ListaNodo)); nuevo  info = elem; nuevo  ant = nuevo  sig =NULL; if (Llongitud==0) L primero = L  ultimo = nuevo; else if(Lventana==Lultimo) { Lventanasig=Lultimo=nuevo; nuevoant=L ventana; } else { nuevoant=Lventana; nuevosig=Lventanasig; Lventanasigant=nuevo; Lventanasig=nuevo; Lventana=nuevo; Llongitud++; /*para agregar un elemento después de la ventana. 1) Se asigna elemento al nodo y coloca sus punteros anterior y siguiente a NULL: 2) Se inserta considerando: La lista está vacía. La ventana está sobre el último elemento de la lista. Se debe adicionar un elemento intermedio.*/

Lista doblemente enlazada, Ejemplo 3 Void elimLista (Lista L){ pListaNodo aux; if (Lventana ==Lprimero) { if(Lultimo==Lprimero) Lultimo=Null; Lprimero= Lprimerosig; free(Lventana); Lventana=Lprimero; } else { if (Lultimo==Lventana) Lultimo= Lultimoant; Lventanaantsig= Lventanasig; if(Lventanasig!=NULL) Lventanasigant= Lventanaant; aux=Lventana; Lventana= Lventanasig; free(aux); Llongitud--; /*elimina el Elemento que Se encuentra En la ventana. Cuando es primero. Cuando es el ultimo Entre nodos*/

Lista doblemente enlazada, Ejemplo 3 Void destruirLista (Lista L) { pListaNodo p q; for (p=Lprimero; p!=NULL;) q=p; p=psig; free(q); } free(L);

Lista doblemente enlazada, Ejemplo 3 Void posLista(Lista L, int pos) { int i; for (Lventana = L primero, i=1; i<pos;i++) Lventana = Lventana  sig; } Void situarLista (Lista L, Ventana vent) Lventana=vent; Ventana ventanaLista (Lista L) reutrn Lventana;

Lista ordenada, Ejemplo 4 Typedef struct ListaNodOrd { TipoDato info; struct ListaNodOrd *sig; } *pListaNodoOr; Typedef struct pListaNodoOr primero; int longitud; } TListaOrd, *ListaOrd; //Crear lista ordenada vacía ListaOrd inicListOrd(void) return inicLista(); }

Lista ordenada, Ejemplo 4 Void InsListOrd(ListaOrd L, TipoDato elem) { pListaNodoOr p=(pListaNodoOr)malloc (sizeof(struct ListaNodOrd)); pListaNodoOr q; pinfo=elem; psig=NULL; if(Lprimero==NULL) Lprimero=p; else if (elem<Lprimeroinfo) { psig = Lprimero; L primero=p; } else { for(q=Lprimero;qsig!=NULL&&elem>qsiginfo; q=qsig); psig=qsig; qsig=p; L longitud++;

Lista ordenada, Ejemplo 4 Void elimListOrd(ListaOrd L, TipoDato elem) { pListaNodoOr p, q; if(Lprimeroinfo==elem) p = Lprimero; L primero=Lprimerosig; free(p); } else for(p=Lprimero;psiginfo!=elem; p=psig); q=psigsig; free(psig); psig=q; L longitud--;