La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Estructuras dinámicas de datos, TAD Lista, parte 2"— Transcripción de la presentación:

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

2 Ejemplos de Implementación de listas en C

3 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.

4 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);

5 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; }

6 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?

7 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; }

8 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.*/ }

9 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.

10 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 */

11 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

12 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; }

13 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.*/

14 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*/

15 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);

16 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;

17 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(); }

18 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++;

19 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--;


Descargar ppt "Estructuras dinámicas de datos, TAD Lista, parte 2"

Presentaciones similares


Anuncios Google