Professional Documents
Culture Documents
LISTAS ENLAZADAS
1 de Diciembre de 2010
lineal y se caracteriza porque cada uno de sus elementos tiene que indicar donde se encuentra el siguiente elemento de la lista.
contiene la informacin y el valor que indica en donde se encuentra el siguiente dato en la lista.
de nodos ligados entre si. Se denomina nodo de lista al espacio de memoria que almacena un elemento de la lista y direccin donde se encuentra el siguiente elemento.
Valor del elemento
Direccin del siguiente elemento
esttica utilizando un arreglo de nodos o, mas comn, con memoria dinmica utilizando nodos enlazados atreves de apuntadores. Cualquiera que sea la representacin seleccionada debe existir un apuntador principal externo a la estructura que almacene la direccin del primer elemento de la lista
primero de un tipo de dato que represente a un nodo que a su vez, permita agrupar el valor almacenado y la direccin del siguiente elemento. Las opciones para esta representacin que ofrece el lenguaje C++, son atreves de un objeto o una estructura.
};
Cuando se crea una lista debe estar vaca. Por tanto
la anterior. Este tipo de listas se utilizan cuando la aplicacin sobre una lista enlazada debe recorrer la lista en ambos sentidos, algo imposible de realizar en una lista enlazada lineal y, aunque es posible hacerlo en una lista circular resulta muy ineficiente.
enlazada
Caractersticas generales de una lista doblemente enlazada. Se requiere mantener un apuntador general a la estructura (lista), a pesar de que lo nodos conocen a su predecesor y a su sucesor. No es necesario que la lista apunte el primer elemento de la lista, ya que siempre podr llegar a el 2. Cada nodo requiere almacenar, adems del elemento, dos direcciones: la del predecesor y la del sucesor 3. El movimiento de apuntadores puede hacerse en ambas direcciones
1.
Declaracin:
Procedimiento de insercin:
1. 2. 3.
void insertarDE(struct listaDE *LDE, int elem) { struct listaDE *actual, *nuevo; /* busca */ actual = LDE->sig; LDE->clave = elem; while (actual->clave < elem) actual = actual->sig; /* crea */ nuevo = (struct listaDE *) malloc(sizeof(struct listaDE)); nuevo->clave = elem; /* enlaza */ actual->ant->sig = nuevo; nuevo->ant = actual->ant; nuevo->sig = actual; actual->ant = nuevo; }
Procedimiento de borrado:
Busca 2. Borrar Funcin:
1.
void borrarDE(struct listaDE *LDE, int elem) { struct listaDE *actual; /* busca */ actual = LDE->sig; LDE->clave = elem; while (actual->clave < elem) actual = actual->sig; /* borra */ if (actual != LDE && actual->clave == elem) { actual->sig->ant = actual->ant; actual->ant->sig = actual->sig; free(actual); } }
enlazada; se obtiene al considerar el primer nodo de la lista como el sucesor del ultimo nodo, almacenando la direccin del primer elemento en el campo de direccin del ultimo, en lugar de almacenar la direccin nula. Al realizar esta modificacin se genera automticamente un circulo donde realmente ya no existe ni el primer ni el ultimo elemento. En las listas circulares, nunca se llega a una posicin en la que ya no sea posible desplazarse. Cuando se llegue al ltimo elemento, el desplazamiento volver a comenzar desde el primer elemento.
Es necesario mantener un apuntador general a la estructura (lista) Aunque ya no apunte obligatoriamente el primer elemento La direccin nula ya no existe en la lista, excepto cuando la lista esta vacia Si la lista contiene un solo elemento, el campo de direccin apuntara a ese mismo nodo Como la lista es un circulo, es posible llegar a cualquier nodo de la lista a partir de cualquiera de sus nodos, lo que es imposible en una lista lineal
Declaracin:
Funcin: void inicializacin (Lista *lista) { lista->inicio = NULL; lista->fin = NULL; tamao = 0; }
Mostrar la lista
void mostrar (Lista * lista) { Elemento *actual; actual = lista->inicio; int i; for(i=0;i<lista->tamao;++i) { cout<<actual, actual->dato); actual = actual->siguiente; } }
int sup_lista_circ(Lista * lista) { if (lista->tamao < 2) return -1; Elemento *sup_element; sup_elemento = lista->inicio; lista->inicio = lista->inicio->siguiente; lista->fin->siguiente = lista->inicio; free (sup_elemento->dato); free (sup_elemento); lista->tamao--; return 0; }
Destruir la lista
void destruir (Lista * lista) { while (lista->tamao > 0) { if (lista->tamao > 1) sup_lista_circ (lista); else sup_lista_circ_unica(lista); }
2.
3.
4.
5.
Se requiere mantener un apuntador general a la estructura (lista), a pesar de que lo nodos conocen a su predecesor y a su sucesor. Este apuntador puede guardar la direccin de cualquier nodo de la lista Cada nodo requiere almacenar, adems del elemento, dos direcciones (la del predecesor y la del sucesor) La direccin nula no existe en la lista, excepto cuando esta vacia Si la lista contiene un elemento, el campo de direccin apuntara a ese mismo nodo El movimiento de apuntadores puede hacerse en ambas direcciones