ED - Listas Doblemente Enlazadas
ED - Listas Doblemente Enlazadas
ED - Listas Doblemente Enlazadas
ASIGNATURA:
ESTRUCTURAS DE DATOS
TEMA:
LISTAS DOBLEMENTE ENLAZADAS
DOCENTE:
ING. CÉSAR SILVA MORE
ALUMNOS:
LUIS FERNANDO CULQUICONDOR PURIZACA
JESÚS SANTIAGO MOSCOL ORDINOLA
RAYMUNDO DOMADOR JEFFERSON JERRY
struct nodo {
int dato;
struct nodo *siguiente;
struct nodo *anterior;
};
Lista es el tipo para declarar listas abiertas doblemente enlazadas. También es posible,
y potencialmente útil, crear listas doblemente enlazadas y circulares.
AÑADIR ELEMENTOS:
1.- Añadir elemento en una lista doblemente
enlazada vacía:
Partiremos de que ya tenemos el nodo a insertar y,
por supuesto un puntero que apunte a él, además
el puntero que define la lista, que valdrá NULL:
El proceso es muy simple, bastará con que:
1. lista apunta a nodo.
2. lista->siguiente y lista->anterior apunten a null.
2. Insertar un elemento en la primera posición de la lista:
Lista apunta al primer elemento de la lista doblemente enlazada. El proceso es el
siguiente:
1. nodo->siguiente debe apuntar a Lista.
2. nodo->anterior apuntará a Lista->anterior.
3. Lista->anterior debe apuntar a nodo.
Una lista no vacía, e insertamos un nodo a continuación de uno nodo cualquiera que
no sea el último de la lista. El proceso sigue siendo muy sencillo:
1. Hacemos que nodo->siguiente apunte a lista->siguiente.
2. Hacemos que Lista->siguiente apunte a nodo.
3. Hacemos que nodo->anterior apunte a lista.
4. Hacemos que nodo->siguiente->anterior apunte a nodo.
Para generalizar todos los casos anteriores, sólo necesitamos añadir una operación:
1. Si lista está vacía hacemos que Lista apunte a nodo. Y nodo->anterior y
nodo->siguiente a NULL.
2. Si lista no está vacía, hacemos que nodo->siguiente apunte a Lista-
>siguiente.
3. Después que Lista->siguiente apunte a nodo.
4. Hacemos que nodo->anterior apunte a Lista.
5. Si nodo->siguiente no es NULL, entonces hacemos que nodo->siguiente-
>anterior apunte a nodo.
El paso 1 es equivalente a insertar un nodo en una lista vacía. Los pasos 2 y 3 equivalen
a la inserción en una lista enlazada corriente.
Los pasos 4, 5 equivalen a insertar en una lista que recorre los nodos en sentido
contrario.
BUSCAR O LOCALIZAR ELEMENTOS:
Dos casos posibles, que el nodo a borrar esté apuntado por Lista o que no. Si lo está,
simplemente hacemos que Lista sea Lista->siguiente.
Dos casos posibles, que el nodo a borrar esté apuntado por Lista o que no. Si lo está,
simplemente hacemos que Lista sea Lista->anterior o Lista->siguiente
Se trata de un caso más general de los dos casos anteriores.
1. Si nodo apunta a Lista, hacemos que Lista apunte a Lista->anterior (o
Lista->siguiente).
2. Hacemos que nodo->anterior->siguiente apunte a nodo->siguiente.
3. Hacemos que nodo->siguiente->anterior apunte a nodo->anterior.
4. Borramos el nodo apuntado por nodo.
#include <stdio.h>
#define ASCENDENTE 1
#define DESCENDENTE 0
typedef struct _nodo {
int valor;
struct _nodo *siguiente;
struct _nodo *anterior;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
/* Funciones con listas: */
void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);
void BorrarLista(Lista *);
void MostrarLista(Lista l, int orden);
int main() {
Lista lista = NULL;
pNodo p;
Insertar(&lista, 20);
Insertar(&lista, 10);
Insertar(&lista, 40);
Insertar(&lista, 30);
MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);
Borrar(&lista, 10);
Borrar(&lista, 15);
Borrar(&lista, 45);
Borrar(&lista, 30);
MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);
BorrarLista(&lista);
return 0;
}
void Insertar(Lista *lista, int v)
{ pNodo nuevo, actual;
}
void Borrar(Lista *lista, int v) {
pNodo nodo;
/* Buscar el nodo de valor v */
nodo = *lista;
while(nodo && nodo->valor < v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;
/* El valor v no está en la lista */
if(!nodo || nodo->valor != v) return;
/* Borrar el nodo */
/* Si lista apunta al nodo que queremos borrar, apuntar a otro */
if(nodo == *lista)
if(nodo->anterior) *lista = nodo->anterior;
else *lista = nodo->siguiente;
if(nodo->anterior) /* no es el primer elemento */
nodo->anterior->siguiente = nodo->siguiente;
if(nodo->siguiente) /* no es el último nodo */
nodo->siguiente->anterior = nodo->anterior;
free(nodo);
}
void BorrarLista(Lista *lista) {
pNodo nodo, actual;
actual = *lista;
while(actual->anterior) actual = actual->anterior;
while(actual)
{ nodo =
actual;
actual = actual->siguiente;
free(nodo);
}
*lista = NULL;
}
void MostrarLista(Lista lista, int orden) {
pNodo nodo = lista;
if(!lista) printf("Lista vacía");
nodo = lista;
if(orden == ASCENDENTE) {
while(nodo->anterior) nodo = nodo->anterior;
printf("Orden ascendente: ");
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->siguiente;
}
}
else {
while(nodo->siguiente) nodo = nodo->siguiente;
printf("Orden descendente: ");
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->anterior;
}
}
printf("\n");
}
tLista crear ()
Argumentos: Ninguno.
Efecto: (Constructor primitivo). Crea un objeto del tipo tLista.
l: Es modificada.
p: Es una posición válida para la lista l.
l: Una lista.
p: Es una posción válida de la lista l.
l: Una lista.
p: Es una posición válida para la lista l, distinta de fin(l).
l: Una lista.
p: Es una posición válida para la lista l, distinta de primero(l).
Linkografía:
http://c.conclase.net/edd/?cap=005#inicio
file:///C:/Users/Hector/Downloads/4%20Estructuras%20Enlazadas%20(2).pdf
http://upsg01.foroactivo.com/t104-tema-3-listas-doblemente-enlazadas
http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/ldoble.html