Sei sulla pagina 1di 17

Ago/2007 Prof.

:MILTON GARCIA
LISTAS DOBLEMENTE ENLAZADAS
Ago/2007 Prof.:MILTON GARCIA
LISTA ENLAZADA: Es una estructura de datos lineal con un nmero
no limitado de elementos homogneos llamados NODOS, a los
cuales se accede mediante punteros.
NODO.- Es una ubicacin de memoria , cuya estructura comprende
tres campos:
Un campo parte denominado INFO, que es donde se guarda el
dato.
Campo llamado SIG, el cual es un puntero, que proporciona la
direccin de memoria del siguiente NODO.
Campo llamado ANT, el cual es de tipo puntero, que proporciona la
direccin de memoria del NODO anterior.
Ago/2007 Prof.:MILTON GARCIA
struct datos
{ tipo campo_1;
tipo campo_2;
tipo campo_n;
};
typedef datos DATO;
struct NODO
{ DATO Info;
NODO *Sig, *Ant;
};
typedef NODO* ptNODO;
ptNODO Ld;
IMPLEMENTACION DE LISTAS DOBLES
Ago/2007 Prof.:MILTON GARCIA
La creacin de la lista es equivalente a la declaracin de una variable
que permita almacenar la direccin del primer nodo de la lista. Esta
variable inicializada en NULL, indica que la lista est vaca, su valor
cambiar por una direccin al momento de insertar el primer nodo:

ptNODO Ld = NULL;
Ld
INICIALIZAR O CREAR LISTA DOBLE
Ago/2007 Prof.:MILTON GARCIA
OPERACIONES BASICAS
Inicializar o crear
Recorrer una lista
Insertar elementos o nodos en la lista
Buscar en la lista
Borrar elementos
Comprobar si la lista est vaca

Ago/2007 Prof.:MILTON GARCIA
Recorrido hacia delante:
La funcin ULTIMO(), recorre la lista hacia delante y devuelve la
direccin del ultimo nodo de la lista.
RECORRER UNA LISTA
ptNODO ULTIMO(ptNODO Ld)
{ ptNODO A;
A = Ld ;
while (A->Sig!=NULL) A = A->Sig;
return A;
}
ptNODO ULTIMO(ptNODO Ld)
{ ptNODO A;
A = Ld ;
while (A->Sig!=NULL) A = A->Sig;
return A;
}
Ago/2007 Prof.:MILTON GARCIA
Recorrido hacia atrs :
La funcin MOSTRAR_INV() recorre la lista en sentido inverso,
mostrando su contenido.
RECORRER UNA LISTA
void MOSTRAR_INV(ptNODO Ld)
{ ptNODO A;
A = ULTIMO(Ld);
while(A != NULL)
{ cout<< A->Info<<setw(4);
A= A->Ant;
}
}
void MOSTRAR_INV(ptNODO Ld)
{ ptNODO A;
A = ULTIMO(Ld);
while(A != NULL)
{ cout<< A->Info<<setw(4);
A= A->Ant;
}
}
9 15 20 10
Ago/2007 Prof.:MILTON GARCIA
OPERACIONES BASICAS
Inicializar o crear
Recorrer una lista
Insertar elementos o nodos en la lista
Buscar en la lista
Borrar elementos
Comprobar si la lista est vaca

Ago/2007 Prof.:MILTON GARCIA
void INSERTAR_INI(ptNODO &Ld, DATO X)
{ ptNODO NUEVO;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(Ld==NULL) Ld=NUEVO;
else
{ NUEVO->Sig=Ld; //[1]
Ld->Ant=NUEVO; //[2]
Ld=NUEVO; //[3]
}
}
void INSERTAR_INI(ptNODO &Ld, DATO X)
{ ptNODO NUEVO;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(Ld==NULL) Ld=NUEVO;
INSERTAR NODOS EN LA LISTA (al inicio)
Ago/2007 Prof.:MILTON GARCIA
INSERTAR NODOS EN LA LISTA (al inicio)
void INSERTAR_INI(ptNODO &Ld, DATO X)
{ ptNODO NUEVO;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(Ld==NULL) Ld=NUEVO;
else
{ NUEVO->Sig=Ld; //[1]
Ld->Ant=NUEVO; //[2]
Ld=NUEVO; //[3]
}
}
void INSERTAR_INI(ptNODO &Ld, DATO X)
{ ptNODO NUEVO;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(Ld==NULL) Ld=NUEVO;
else
{ NUEVO->Sig=Ld; //[1]
Ld->Ant=NUEVO; //[2]
Ld=NUEVO; //[3]
}
}
Ago/2007 Prof.:MILTON GARCIA
void INSERTAR_FIN(ptNODO &Ld, DATO X)
{ ptNODO NUEVO,U;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(ListaVacia(Ld)) Ld=NUEVO;
else
{ U=ULTIMO(Ld);
U->Sig=NUEVO; //[1]
NUEVO->Ant=U; //[2]
}
}
INSERTAR NODOS EN LA LISTA (al final)
void INSERTAR_FIN(ptNODO &Ld, DATO X)
{ ptNODO NUEVO,U;
NUEVO=new(NODO);
NUEVO->Info=X;
NUEVO->Sig=NULL;
NUEVO->Ant=NULL;
if(ListaVacia(Ld)) Ld=NUEVO;
else
{ U=ULTIMO(Ld);
U->Sig=NUEVO; //[1]
NUEVO->Ant=U; //[2]
}
}
Ago/2007 Prof.:MILTON GARCIA
INSERTAR NODOS EN LA LISTA (Punto Intermedio)
void INSERTAR_NODO(ptNODO &Ld, DATO X, int POS)
{ int i;
ptNODO A = Ld, NUEVO=new(NODO);
NUEVO ->Info = X; NUEVO->Sig = NULL; NUEVO->Ant = NULL;
if(POS==1 || Ld==NULL)
{ NUEVO->Sig = Ld;
Ld = NUEVO; }
else
{ i=1;
while(i<POS-1 && A->Sig != NULL)
{ i++;
A=A->Sig; }
if(A->Sig != NULL)
{ NUEVO->Sig = A->Sig; //[1]
A->Sig->Ant = NUEVO; //[2]
A->Sig = NUEVO; //[3]
NUEVO->Ant = A; } //[4]
else
{ A->Sig=NUEVO;
NUEVO->Ant = A;
}
}
}
void INSERTAR_NODO(ptNODO &Ld, DATO X, int POS)
{ int i;
ptNODO A = Ld, NUEVO=new(NODO);
NUEVO ->Info = X; NUEVO->Sig = NULL; NUEVO->Ant = NULL;
if(POS==1 || Ld==NULL) INSERTAR_INI(Ld,X);
else
{ i=1;
while(i<POS-1 && A->Sig != NULL)
{ i++;
A=A->Sig; }
if(A->Sig != NULL)
{ NUEVO->Sig = A->Sig; //[1]
A->Sig->Ant = NUEVO; //[2]
A->Sig = NUEVO; //[3]
NUEVO->Ant = A; } //[4]
else
{ A->Sig=NUEVO;
NUEVO->Ant = A;
}
}
}
void INSERTAR_NODO(ptNODO &Ld, DATO X, int POS)
{ int i;
ptNODO A = Ld, NUEVO=new(NODO);
NUEVO ->Info = X; NUEVO->Sig = NULL; NUEVO->Ant = NULL;
if(POS==1 || Ld==NULL) INSERTAR_INI(Ld,X);
else
{ i=1;
while(i<POS-1 && A->Sig != NULL)
{ i++;
A=A->Sig; }
if(A->Sig != NULL)
{ NUEVO->Sig = A->Sig; //[1]
A->Sig->Ant = NUEVO; //[2]
A->Sig = NUEVO; //[3]
NUEVO->Ant = A; } //[4]
else INSERTAR_FIN(Ld,X);
}
}
Ago/2007 Prof.:MILTON GARCIA
INSERTAR NODOS EN LA LISTA (Punto Intermedio)
i=1;
while(i<POS-1 && A->Sig != NULL)
{ i++;
A=A->Sig;
}
if(A->Sig != NULL)
{ NUEVO->Sig = A->Sig; //[1]
A->Sig->Ant = NUEVO; //[2]
A->Sig = NUEVO; //[3]
NUEVO->Ant = A; //[4]
}
i=1;
while(i<POS-1 && A->Sig != NULL)
{ i++;
A=A->Sig;
}
if(A->Sig != NULL)
{ NUEVO->Sig = A->Sig; //[1]
A->Sig->Ant = NUEVO; //[2]
A->Sig = NUEVO; //[3]
NUEVO->Ant = A; //[4]
}
Ago/2007 Prof.:MILTON GARCIA
BORRAR NODO conociendo su direccin
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
P
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
Ago/2007 Prof.:MILTON GARCIA
BORRAR NODO conociendo su direccin
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
P
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
Ago/2007 Prof.:MILTON GARCIA
BORRAR NODO conociendo su direccion
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
P
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
Ago/2007 Prof.:MILTON GARCIA
BORRAR NODO conociendo su direccion
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}
P
void BORRAR_NODO(ptNODO &Ld, ptNODO &P)
{ if(Ld!=NULL && P != NULL)
{ if(P==Ld && P->Sig == NULL) Ld=NULL;
else if(P==Ld)
{ Ld = Ld->Sig; //[1]
Ld->Ant = NULL; //[2]
}
else if(P != ULTIMO(Ld))
{ P->Ant->Sig = P->Sig; //[3]
P->Sig->Ant = P->Ant; //[4]
}
else P->Ant->Sig = NULL; //[5]
delete(P);
}
}

Potrebbero piacerti anche