LISTAS ESPECIALES

6,039 views

Published on

LISTAS ESPECIALES

Published in: Education
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
6,039
On SlideShare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
0
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

LISTAS ESPECIALES

  1. 1. LISTAS ESPECIALES Estructuras de Datos
  2. 2. LISTAS: OPERACIONES BASICAS <ul><li>CrearLista() </li></ul><ul><li>EliminarLista(L) </li></ul><ul><li>Referencia_Nodo ConsultarPrimero(L) </li></ul><ul><li>Referencia_Nodo ConsultarUltimo(L) </li></ul><ul><li>bool EstaVacia(L) </li></ul><ul><li>bool EstaLlena(L) </li></ul><ul><li>InsertarNodoInicio(L, C) </li></ul><ul><li>InsertarNodoFinal(L, C) </li></ul><ul><li>InsertarNodoAntesDe(L, P, C) </li></ul><ul><li>Referencia_Nodo EliminarPrimero(L) </li></ul><ul><li>Referencia_Nodo EliminarUltimo(L) </li></ul><ul><li>EliminarNodo(L, P) </li></ul><ul><li>Referencia_Nodo BuscarNodo(L, C) </li></ul><ul><li>Referencia_Nodo PosAnterior(L, P) </li></ul><ul><li>Recorrer(L) </li></ul>Dada la Lista L, la posición P y la información C
  3. 3. TDA: LISTAS DOBLEMENTE ENLAZADAS <ul><li>En las listas enlazadas solo se avanza en un sentido </li></ul><ul><li>En las doblemente, se puede avanzar hacia la derecha o hacia la izq. </li></ul><ul><li>En estas listas cada nodo tiene </li></ul><ul><ul><li>Un predecesor, excepto el primero </li></ul></ul><ul><ul><li>Un sucesor, excepto el ultimo </li></ul></ul><ul><li>Cada nodo ya no tiene un solo enlace, tiene dos, hacia el siguiente y hacia el anterior </li></ul><lde> ::= <comienzo> + {<nodo>}+<ultimo> <comienzo> :: = <enlace> <ultimo> :: = <enlace> <enlace> ::= (<<referencia_nodo>> | NULL) <nodo> ::= <predecesor>+<contenido>+<sucesor> <predecesor> ::= <enlace> <sucesor> ::= <enlace> < contenido > ::= <<dato>>{<<dato>>}
  4. 4. LDE: IMPLEMENTACION typedef struct { LDE_Nodo *header; LDE_Nodo *last; }LDE; typedef struct LDE_Nodo { Generico G; struct LDE_nodo *sig; struct LDE_nodo *ant; } LDE_nodo ; Cuando la lista esta vacia, header y last, son iguales a NULL I DS DA last header 10 5 8 25 2 31
  5. 5. INSERTAR NODOS bool LDE_InsertarNodoInicio (LDE *L, LDE_nodo *nuevo){ if(!nuevo) return FALSE; if(LDE_EstaVacia(*L)) L->header = L->last = nuevo; else{ nuevo->sig = L->header; L->header->ant = nuevo; L->header = nuevo; } return TRUE; } bool LDE_InsertarNodoFin (LDE *L, LDE_nodo *nuevo){ if(!nuevo) return FALSE; if(LDE_EstaVacia(&L)) L->header = L->last = nuevo; else{ nuevo->ant = L->last; L->last->sig = nuevo; L->last = Nuevo; } return FALSE; } nuevo->sig = header header->ant = nuevo header = nuevo nuevo->ant = last last->sig = nuevo last = nuevo 10 5 21 12 17 6 last header header nuevo 15 last nuevo 15 header
  6. 6. INSERTAR ENTRE bool LDE_InsertarNodo(LDE *L, LDE_nodo *p, LDE_nodo *nuevo){ if (!p || !LDE_Existe(*L,P)) return FALSE; if(LDE_EstaVacia(*L) || p==L->last) LDE_InsertarNodoFin(L,nuevo); else { if(!nuevo) return FALSE; nuevo->sgt = p->sgt; p->sgt = nuevo; P->sgt->ant = nuevo; nuevo->ant = p; } return TRUE; } nuevo->sig = p->sig; p->sig = nuevo nuevo->ant = p nuevo->sig->ant = nuevo header last 10 5 21 12 17 6 p nuevo 15
  7. 7. ELIMINAR NODOS LDE_nodo * LDE_EliminarxPos (LDE *L, LDE_nodo *p){ if(!p || !LDE_Existe(L,P)) return NULL; if(p==L->header){ return(LDE_SacarNodoInicio(L)); } else if (P==L->last){ return(LDE_SacarNodoFin(L)); } else { p->ant->sig = p->sig; p->sig->ant = p->ant; } return p; } p->ant->sig = p->sig; P->sig->ant = p->ant free(p); tmp = L->header; L->header = L->header->sig; L->header->ant = NULL; return(tmp); tmp= L->last; L->last = L->last->ant; L->last->sig = NULL; return(tmp); LDE_nodo *LDE_EliminarxInfo(LDE *L, Generico G, Generico_Comparar fn){ LDE_Nodo *p ; if(EstaVacia(L)) return; p = LDE_Buscar(L,G, fn); if (!p) return NULL; return(LDE_EliminarxPos(L,P);) } 10 5 21 12 17 6 header last p
  8. 8. LISTAS CIRCULARES <ul><li>El avance en las listas enlazadas es </li></ul><ul><ul><li>Solo a la derecha(siguiente) </li></ul></ul><ul><ul><li>Limitado hasta el ultimo nodo </li></ul></ul><ul><li>Hay ocasiones en las que se desearia, </li></ul><ul><ul><li>Poder avanzar ilimitadamente </li></ul></ul><ul><ul><li>Del ultimo nodo, pasar al primero </li></ul></ul><ul><ul><ul><li>last->siguiente = header </li></ul></ul></ul>10 5 8 2 31 25 last->sig last
  9. 9. EL TDA LISTA CIRCULAR <ul><li>No es necesario mantener un control de: </li></ul><ul><ul><li>Primero y ultimo </li></ul></ul><ul><ul><li>Solo con el ultimo ya se tiene todo, pues </li></ul></ul><ul><ul><ul><li>last ->siguiente es igual a header </li></ul></ul></ul>typedef struct LCE_nodo { Generico G; struct LCE_nodo *sig; }LCE_nodo; typedef LCE_nodo *LCE;
  10. 10. CREAR NODO <ul><li>Para crear un nodo valido </li></ul><ul><li>LCE_Nodo * LCE_Nodo_Crear(Generico G){ </li></ul><ul><ul><li>LCE_Nodo *nuevo; </li></ul></ul><ul><ul><li>nuevo = malloc(sizeof(LCE_Nodo)); </li></ul></ul><ul><ul><li>nuevo->G = G; </li></ul></ul><ul><ul><li>nuevo->sig = nuevo; </li></ul></ul><ul><ul><li>return nuevo; </li></ul></ul><ul><li>} </li></ul>I DS
  11. 11. LOCALIZA <ul><li>LCE_nodo *LC_Buscar(LCE *L, Generico G, Generico_Comparar fn){ </li></ul><ul><ul><li>LCE_nodo *p; </li></ul></ul><ul><ul><li>if(LCE_EstaVacia(*L)) return NULL; </li></ul></ul><ul><ul><li>p = L; </li></ul></ul><ul><ul><li>do{ </li></ul></ul><ul><ul><ul><li>if(fn(p->G, G) == 0) return(p); </li></ul></ul></ul><ul><ul><ul><li>p = p->sig; </li></ul></ul></ul><ul><ul><li>}while(p!= L); </li></ul></ul><ul><ul><li>return(NULL); </li></ul></ul><ul><li>} </li></ul>Busco 25 Busco 13 10 5 8 2 31 25 last->sig last p p p p p p p p p p
  12. 12. ANTERIOR <ul><li>Es buscar el anterior a un nodo dado </li></ul><ul><li>LCE_Nodo *LCE_Anterior(LCE *L, LCE_nodo *p){ </li></ul><ul><ul><li>LCE_Nodo *q; </li></ul></ul><ul><ul><li>if(LCE_EstaVacia(L) || q== NULL) LCE_Anterior = NULL; </li></ul></ul><ul><ul><li>q = L; </li></ul></ul><ul><ul><li>do{ </li></ul></ul><ul><ul><ul><li>if(q->sig == p) return(q); </li></ul></ul></ul><ul><ul><ul><li>q = q->sig; </li></ul></ul></ul><ul><ul><li>}while(q!=L); </li></ul></ul><ul><ul><li>return(NULL); </li></ul></ul><ul><li>} </li></ul>
  13. 13. INSERTAR INICIO Y FIN bool LCE_InsertarNodoInicio(LCE *L, LCE_nodo *nuevo ){ if(nuevo == NULL) return FALSE; if(LCE_EstaVacia(*L)) L = nuevo; else{ nuevo->sig = L->sig; L->sig = nuevo; } return TRUE; } bool LCE_InsertarNodoFin(LCE *L, LCE_Nodo *nuevo){ if(nuevo == NULL) return FALSE; if(LCE_EstaVacia(L)) L = nuevo; else{ nuevo->sigt = L->sig; L->sig = nuevo; } L = nuevo; return TRUE; } nuevo->sig = last->sig last->sig = nuevo last = nuevo 10 5 8 2 31 25 last->sig last 10 nuevo last
  14. 14. INSERTAR EN MEDIO bool LCE_Insertar(LCE *L, LCE_Nodo *P, LCE_Nodo *nuevo){ if(P == NULL || !LCE_Existe(*L,P)) return FALSE; if(LCE_EstaVacia(*L) || p==L) LCE_InsertarNodoFin(L,nuevo); else { nuevo->sig = P->sig; P->sig = Nuevo; } return TRUE; }
  15. 15. ELIMINA LCE_Nodo * LCE_EliminarxInfo(LCE *L, Generico G, Generico_Comparacion fn){ LCE_Nodo *p ; if(LCE_EstaVacia(*L)) return 0; p = LCE_Buscar(*L,I,fn); if(p == NULL) return 0; return(LCE_EliminarxPos(L,p)); } LCE_Nodo *LCE_EliminarxPos(LCE *L, LCE_nodo *p){ LCE_Nodo *elminado, *ant; if(p == NULL || !LCE_Existe(*L,p)) return NULL; if(L ==L->sig){ L = NULL; return(L); } else if (p==L){ return(LCE_SacarNodoFin(L)); } else { ant = LCE_Anterior(*L,p); ant->sig = p->sig; return(p); } } eliminado = L ant = LCE_Anterior(L,L); ant->sig = L->sig; return(eleminado);
  16. 16. LISTAS CIRCULARES DOBLEMENTE ENLAZADAS <ul><li>Es una implementacion de listas circulares </li></ul><ul><ul><li>Con nodos que tienen dos punteros </li></ul></ul><ul><li>Asi se recorre la lista en el </li></ul><ul><ul><li>Sentido del avance del reloj y </li></ul></ul><ul><ul><li>En sentido contrario </li></ul></ul><ul><li>Seguimos llevando un control solo del ultimo nodo de la lista </li></ul>10 5 8 25 2 31 last
  17. 17. RECORRER LISTA <ul><li>Escribir una operación Recorre_R que recorre una lista cir. Dobl. Enla. Hacia atras </li></ul><ul><li>void LCDE_Recorre_R(LCDE L, Generico_Imprimir fn){ </li></ul><ul><ul><li>LCDE_nodo *pos; </li></ul></ul><ul><ul><li>if(!LCDE_EstaVacia(L)) return; </li></ul></ul><ul><ul><li>pos = L; while(TRUE){ </li></ul></ul><ul><ul><ul><li>pos = pos->ant; </li></ul></ul></ul><ul><ul><ul><li>if(pos == L) break; </li></ul></ul></ul><ul><ul><ul><li>fn(pos->G); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>

×