Upload
francisco-reina
View
30
Download
0
Embed Size (px)
Citation preview
5/23/2018 listas enlazadas
1/75
Pag. 1
LISTAS ENLAZADAS
Ing. Betty Surez Torres
5/23/2018 listas enlazadas
2/75
Pag. 2
DEFINICIN
Una lista enlazada es una coleccin o secuencia deelementos dispuestos uno detrs de otro, en la quecada elemento se conecta al siguiente elemento por un
enlace o puntero.
Los elementos de una lista se llaman nodos y secomponen de dos partes o campos: la primera parte ocampo contiene la informacin y la segunda parte o
campo es un puntero (denominado enlace o sgte) que
apunta al siguiente elemento de la lista.
a1 a2 a3
..
5/23/2018 listas enlazadas
3/75
Pag. 3
CLASIFICACIN DE LAS LISTASENLAZADAS
Simplementeenlazadas
Doblementeenlazadas
Circularsimplemente
enlazada
Circulardoblemente
enlazada
Cada nodo
(elemento) contiene
un nico enlace que
conecta ese nodo al
nodo siguiente o
nodo sucesor. La
lista es eficiente en
recorridos directos
((
5/23/2018 listas enlazadas
4/75
Pag. 4
OPERACIN: DECLARAR UN NODO
C++
struct nodo{int info;
struct nodo *sig;
};
info sig
nodo
5/23/2018 listas enlazadas
5/75
Pag. 5
OPERACIN: INSERTAR A INICIO DE LA LISTA
10 25 40
CAB
NULL
1000 1001 1002
75AUX
1100
10 25 40
CAB
NULL
1000 1001 1002
75
AUX
1100
NULL
10 25 40CAB NULL
1000 1001 1002
75
AUX
1100
10 25 40CAB NULL
1000 1001 1002
75
1100
CAB=10=DM10=1000AUX->DATO=75AUX->SIG=NULL
AUX->SIG=CAB=10=DM10=1000CAB=AUX=10=DM10=1000
void insertarc(void){
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->sig=NULL;
if(CAB!=NULL){
AUX->sig=CAB; }
CAB=AUX;
5/23/2018 listas enlazadas
6/75
Pag. 6
OPERACIN: INSERTAR AL FINAL DE LA LISTA
10 25 40
CAB
NULL
1000 1001 1002
75AUX
1100
10 25 40
CAB
NULL
1000 1001 1002
NULL
P
P
10 25 40
CAB
NULL
1000 1001 1002
P
10 25 40
CAB
NULL
1000 1001 1002
75AUX
1100
NULL
P
10 25 40
CAB
NULL
1000 1001 1002
P
75
1100
P=CAB=10=dm10=1000P->sig=25=dm25=1001P->sig=40=dm40=1002
P->sig=AUX=75=dm75=1100
void insertar(void){
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->sig=NULL;
if(CAB==NULL){
CAB=AUX; }else{
P=CAB;
while(P->sig!=NULL){
P=P->sig; }
P->sig=AUX; }
5/23/2018 listas enlazadas
7/75Pag. 7
OPERACIN: INSERTAR ANTES DE
10 25 40
CAB
NULL
1000 1001 1002
75Q
1100
10 25 40
CAB
NULL
1000 1001 1002
NULL
AUX
T
75Q
1100
10 75 25
CAB
NULL
1000 1100 1001
40
1002
AUX
X=25AUX=CAB=10=DM10=100010!=25 (v)
T=AUX=10
AUX=AUX->sig=40=dm25=100125!=25 (f)T->sig=Q=75=dm75=1100Q=Q->sig=AUX=25=dm25=1001
5/23/2018 listas enlazadas
8/75Pag. 8
void insertara(void){
struct nodo *Q, *T;
int x, sw;
if(CAB==NULL){
printf("\nLista vacia!!...");getch();
}
else{
AUX=CAB;
sw=1;
printf("\nInsertar antes de...");scanf("%d",&x);
while((AUX->info!=x)&&(sw==1)&&(AUX!=NULL)){
if(AUX->sig!=NULL){
T=AUX;
AUX=AUX->sig;
}
else {
sw=0; } }
if(sw==0){
printf("\n%d no esta en la lista!!...\n",
x);
getch();
}else{
Q=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &Q->info);
if(CAB==AUX){
Q->sig=CAB;
CAB=Q; }
else{
T->sig=Q;
Q->sig=AUX; }
printf("\nHa sido insertado!!") ;getch(); }
} }
5/23/2018 listas enlazadas
9/75Pag. 9
void insertad(void){
struct nodo *Q;
int x;
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();
}
else{
AUX=CAB;
printf("\nInsertar despues de...");
scanf("%d",&x);
while((AUX->info!=x)&&(AUX!=NULL)){
AUX=AUX->sig; }
if(AUX==NULL){
printf("\n%d no esta en la
lista!!...", x);
getch();}
else{
Q=new(nodo);
printf("\nNumero a insertar: ");
scanf("%d", &Q->info);
Q->sig=AUX->sig;
AUX->sig=Q;
printf("\nHa sidoinsertado!!") ;
getch(); } }
}
INSERTAR DESPUS DE
5/23/2018 listas enlazadas
10/75Pag. 10
OPERACIN: ELIMINAR UN ELEMENTO
10 25 40
CAB
NULL
1000 1001 1002
10 25 40
CAB
NULL
1000 1001 1002
AUX P
AUX P
10 25 40
CAB
NULL
1000 1001 1002
AUX P
NULL
X=40
P=CAB=10=dm10=100010!=40 (v)
AUX=P=10P=P->sig=dm25=1001
25!=40 (v)AUX=P=25P=P->sig=dm40=1002
40!=40 (f)AUX->sig=P->sig=NULL
5/23/2018 listas enlazadas
11/75Pag. 11
void elimina(void){
int x, sw=1;
if(CAB==NULL)
{printf("\nLista vacia!!...");
getch();
}
else{
printf("\nEliminar el elemento...");scanf("%d", &x);
P=CAB;
while(((P->info)!=x)&&(sw==1)){
if((P->sig)!=NULL){
AUX=P;P=P->sig; }
else{
sw=0; } }
if(sw==0){
printf("\n%d no esta en la lista!!...",
x);getch();
}
else{
if(P==CAB){
CAB=CAB->sig;}
else{
AUX->sig=P->sig;
}
free(P);printf("\n%d ha sido eliminado", x);
getch();
} } }
5/23/2018 listas enlazadas
12/75Pag. 12
OPERACIN: ELIMINAR EL PRIMERELEMENTO
10 25 40
CAB
NULL
1000 1001 1002
10 25 40
P
NULL
1000 1001 1002
P
CAB
25 40 NULL
1001 1002
CAB
P=CAB=10CAB=CAB->sig=dm25=1001
void eliminap(void){if(CAB==NULL)
{
printf("\nLista vacia!!...");
getch();
}
else{P=CAB;
printf("\n%d ha sido eliminado",P->info);
getch();
if(P->sig==NULL){CAB=NULL; }
else{
CAB=CAB->sig; }
free(P); } }
5/23/2018 listas enlazadas
13/75Pag. 13
OPERACIN: ELIMINAR LTIMO ELEMENTO10 25 40
CAB
NULL
1000 1001 1002
P AUX
10 25 40
CAB
NULL
1000 1001 1002
PAUX
10 25 40
CAB
NULL
1000 1001 1002
PAUX
10 25 40
CAB
NULL
1000 1001 1002
PAUX
10 25
CAB
NULL
1000 1001
AUX
10 25 40 NULL
1000 1001 1002
PAUX
CAB
P=CAB=10AUX=P=10P=P->sig=dm25=1001AUX=25P=P->sig=dm40=1002
P=P->sig=NULLAUX->sig=NULL
void eliminau(void){
if(CAB==NULL) {printf("\nLista vacia!!...");
getch(); }
else{
P=CAB;
if(P->sig==NULL){
CAB=NULL; }
else{
while(P->sig!=NULL){
AUX=P;
P=P->sig; }
AUX->sig=NULL; }printf("\n%d ha sido eliminado", P-
>info);
getch();
free(P); } }
5/23/2018 listas enlazadas
14/75Pag. 14
OPERACIN: ELIMINAR ANTES DE
10 25 40
CAB
NULL
1000 1001 1002
P AUX
10 25 40
CAB
NULL
1000 1001 1002
QAUX
10 25 40
CAB
NULL
1000 1001 1002
QP
10 40 NULL
1000 1002
CAB
Q
P
AUX
X=40
Q=CAB=10AUX=CAB=10P=CAB=10
Q->info!=x10!=40P=AUX=10AUX=Q=10Q=Q->sig=dm25=1001
25!=40P=AUX=10AUX=Q=25Q=Q->sig=dm40=1002
40!=40
P=P->sig=Q=dm40=1002
5/23/2018 listas enlazadas
15/75Pag. 15
void elimina_a(void){
struct nodo *Q;
int x;
if(CAB==NULL) {
printf("\nLista vacia!!...");getch(); }
else{
printf("\nEliminar antes de...");
scanf("%d",&x);
if(CAB->info==x){
printf("\nNo existen elementosantes de %d!!", x);
getch();
return; }
else{Q=CAB;
AUX=CAB;
P=CAB;
while((Q!=NULL)&&(Q->info!=x)){
P=AUX;
AUX=Q;
Q=Q->sig;}
if(Q==NULL){
printf("\n%d no esta en la
lista!!...", x);
getch();}
else{
P->sig=Q;
printf("%d ha sido eliminado",
AUX->info);getch();
free(AUX); } } }
}
5/23/2018 listas enlazadas
16/75Pag. 16
OPERACIN: ELIMINAR DESPUS DE
10 25 40
CAB
NULL
1000 1001 1002
P
10 25 40
CAB
NULL
1000 1001 1002
P
10 25 40
CAB
NULL
1000 1001 1002
AUX
10 25 NULL
1000 1001
CAB
P
10 25 40
CAB
NULL
1000 1001 1002
P AUX
X=25
P=CAB=10P->info!=x
10!=25P=P->sig=dm25=100125!=25
AUX=P->sig=dm10=1000P->sig=AUX->sig=NULLAUX->sig=NULL
5/23/2018 listas enlazadas
17/75Pag. 17
void elimina_d(void){
int x, sw=1;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch();
}
else{
printf("\nEliminar despuesde...");
scanf("%d",&x);
P=CAB;
while((sw==1)&&(P->info!=x)){
if(P->sig!=NULL){
P=P->sig;
}
else{
sw=0;
} }//fin del while
if(P->info!=x){
printf("\n%d no esta en la lista!!...",
x);
getch();return; }
if(P->sig==NULL){
printf("\nNo existen elementos
despus de %d!!" , x);
getch() }else{
AUX=P->sig;
P->sig=AUX->sig;
AUX->sig=NULL;
printf("\n%d ha sido eliminado " ,AUX->info);
getch();
free(AUX); }
}//fin del else }
5/23/2018 listas enlazadas
18/75Pag. 18
OPERACIN: BUSCAR
10 25 40
CAB
NULL
1000 1001 1002
AUX
10 25 40
CAB
NULL
1000 1001 1002
AUX
10 25 40
CAB
NULL
1000 1001 1002
AUX
X=40AUX=CAB=10
10!=40 y AUX!=NULLAux=AUX->sig=dm25
25!=40 y AUX!=NULLAux=AUX->sig=dm40
40!=40 y AUX!=NULL
5/23/2018 listas enlazadas
19/75Pag. 19
void buscar(void){
int x;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch(); }
else{
AUX=CAB;
printf("\n--BUSQUEDA--\n");
printf("Digite el elememto a buscar...");scanf("%d", &x);
while((AUX->info!=x)&&(AUX!=NULL)){
AUX=AUX->sig; }
if(AUX==NULL){
printf("\n%d no esta en la lista!!...", x);getch(); }
else{
printf("\n%d esta en la lista...", x);
getch(); } } }
5/23/2018 listas enlazadas
20/75Pag. 20
OPERACIN: MOSTRAR
10 25 40
CAB
NULL
1000 1001 1002
AUX
10 25 40
CAB
NULL
1000 1001 1002
AUX
10 25 40
CAB
NULL
1000 1001 1002
AUX
AUX=AUX-
>sig=dm25=1001AUX=AUX->sig=dm40=1002AUX=AUX->sig=NULL
void mostrar(void){
int i=1;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch();
return;
}
AUX=CAB;printf("\nContenido de la lista\n");
while(AUX!=NULL){
printf("%d\n",AUX->info);
AUX=AUX->sig;
i++;}
getch();
}
5/23/2018 listas enlazadas
21/75Pag. 21
PROGRAMA COMPLETO LISTASENLAZADAS SIMPLES
#include#include
#include //free
using namespace std;
struct nodo{int info;
struct nodo *sig;
};
struct nodo *CAB=NULL,
*AUX=NULL, *P=NULL;
int valor;
void insertar(void);
void mostrar(void);
void insertarc(void);
void buscar(void);
void ordenar(void);
void insertad(void);void submenu (void);
void insertara(void);
void eliminar(void);
void elimina(void);
void eliminap(void);
void eliminau(void);
void elimina_a(void);
void elimina_d(void);
5/23/2018 listas enlazadas
22/75Pag. 22
void main(){
int op;
do{
printf("\n--MENU PRINCIPAL--\n");
printf("1.Insertar \n");
printf("2.Eliminar \n");
printf("3.Buscar elemento\n");
printf("4.Ordenar la lista\n");
printf("5.Mostrar\n");
printf("0.Salir\n");
printf("Escoja una opcion: ");scanf("%d",&op);
switch(op){
case 1:submenu(); break;
case 2:eliminar(); break;
case 3:buscar(); break;case 4:ordenar(); break;
case 5:mostrar(); break;
}
}while(op!=0);
getch(); }//fin del main
5/23/2018 listas enlazadas
23/75Pag. 23
void submenu (void){
int opc;
do{
printf("\n--INSERTAR--\n");
printf("1.Insertar al final\n");
printf("2.Insertar al comienzo\n");
printf("3.Insertar antes de\n");
printf("4.Insertar despues de\n");
printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");scanf("%d",&opc);
switch(opc){
case 1:insertar(); break;
case 2:insertarc(); break;
case 3:insertara(); break;case 4:insertad(); break;
}
}while(opc!=0);
}//fin de submenu
5/23/2018 listas enlazadas
24/75Pag. 24
void insertar(void){
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);AUX->sig=NULL;
if(CAB==NULL){
CAB=AUX;
}
else{
P=CAB;
while(P->sig!=NULL){
P=P->sig;
}
P->sig=AUX;
}}//fin de insertar al final
void insertarc(void){
AUX=new(nodo);
printf("\nNumero a insertar:
") ;
scanf("%d", &AUX->info);
AUX->sig=NULL;
if(CAB!=NULL){
AUX->sig=CAB;
}
CAB=AUX; }
5/23/2018 listas enlazadas
25/75Pag. 25
void insertara(void){
struct nodo *Q, *T;
int x, sw;
Q=new(nodo);
printf("\nNumero a insertar: ") ;scanf("%d", &Q->info);
printf("\nInsertar antes de...");
scanf("%d",&x);
if(CAB==NULL){
printf("\nLista vacia!!...");
getch(); }
else{
AUX=CAB;
sw=1;
while((AUX->info!=x)&&(sw==1)&&(AUX!=NULL)){
if(AUX->sig!=NULL){T=AUX;
AUX=AUX->sig;
}
else
sw=0; }
5/23/2018 listas enlazadas
26/75Pag. 26
if(sw==0){
printf("\n%d no esta en la lista!!...\n", x);
getch();
}else{
if(CAB==AUX){
Q->sig=CAB;
CAB=Q;
}else{
T->sig=Q;
Q->sig=AUX;
}
printf("\nHa sido insertado!!") ;getch();
}
}
}//fin de insertar antes de
5/23/2018 listas enlazadas
27/75
Pag. 27
void insertad(void){
struct nodo *Q;
int x;
Q=new(nodo);printf("\nNumero a insertar: ") ;
scanf("%d", &Q->info);
printf("\nInsertar despues de...");
scanf("%d",&x);
if(CAB==NULL){printf("\nLista vacia!!...");
getch();
}
else{ AUX=CAB;
while((AUX->info!=x)&&(AUX!=NULL)){
AUX=AUX->sig;
}
5/23/2018 listas enlazadas
28/75
Pag. 28
if(AUX==NULL){
printf("\n%d no esta en la lista!!...", x);getch();
}
else{
Q->sig=AUX->sig;AUX->sig=Q;
printf("\nHa sido insertado!!") ;
getch();
}
}}//fin de insertar despues de
5/23/2018 listas enlazadas
29/75
Pag. 29
void eliminar(void){
int opc;
do{
printf("\n--ELIMINAR--\n");
printf("1.Eliminar el elemento\n");printf("2.Eliminar el primer elemento\n");
printf("3.Eliminar el ultimo elemento\n");
printf("4.Eliminar antes de\n");
printf("5.Eliminar despues de\n");
printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");scanf("%d",&opc);
switch(opc){
case 1:elimina(); break;
case 2:eliminap(); break;
case 3:eliminau(); break;case 4:elimina_a(); break;
case 5:elimina_d(); break;
}
}while(opc!=0);
}//fin de eliminar
5/23/2018 listas enlazadas
30/75
Pag. 30
void elimina(void){
int x, sw=1;
if(CAB==NULL){
printf("\nLista vacia!!...");getch();
}
else{
printf("\nEliminar el elemento...");
scanf("%d", &x);P=CAB;
while(((P->info)!=x)&&(sw==1)){
if((P->sig)!=NULL){
AUX=P;P=P->sig;
}
else
sw=0; }
5/23/2018 listas enlazadas
31/75
Pag. 31
if(sw==0){
printf("\n%d no esta en la lista!!...", x);
getch();
}
else{
if(P==CAB)
CAB=CAB->sig;
elseAUX->sig=P->sig;
free(P);
printf("\n%d ha sido eliminado", x);
getch();
}
}
} //fin de eliminar el elemento
5/23/2018 listas enlazadas
32/75
Pag. 32
void eliminap(void){
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();}
else{
P=CAB;
if(P->sig==NULL)CAB=NULL;
else
CAB=CAB->sig;
printf("\n%d ha sido eliminado", P->info);
free(P);}
getch();
}// fin de eliminar primero
5/23/2018 listas enlazadas
33/75
Pag. 33
void eliminau(void){
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();
}else{
P=CAB;
if(P->sig==NULL)
CAB=NULL;
else{
while(P->sig!=NULL){AUX=P;
P=P->sig;
}
AUX->sig=NULL;
}printf("\n%d ha sido eliminado", P->info);
free(P);
getch();
}
}//fin de eliminar ultimo
5/23/2018 listas enlazadas
34/75
Pag. 34
void elimina_a(void){
struct nodo *Q;
int x;
printf("\nEliminar antes de...");
scanf("%d",&x);if(CAB==NULL){
printf("\nLista vacia!!...");
getch();
}
else{ if(CAB->info==x){
printf("\nNo existen elementos antes de %d!!",
x);
getch();
return;
}else{
Q=CAB;
AUX=CAB;
P=CAB;
5/23/2018 listas enlazadas
35/75
Pag. 35
while((Q!=NULL)&&(Q->info!=x)){
P=AUX;
AUX=Q;
Q=Q->sig;}
if(Q==NULL){
printf("\n%d no esta en la lista!!...", x);
getch();
}
else{
P->sig=Q;
printf("%d ha sido eliminado", AUX->info);
free(AUX);
}
}}
getch();
}//fin de eliminar antes de
void elimina d(void){
5/23/2018 listas enlazadas
36/75
Pag. 36
void elimina_d(void){
int x, sw=1;
printf("\nEliminar despues de...");
scanf("%d",&x);
if(CAB==NULL){printf("\nLista vacia!!...");
getch();
}
else{ P=CAB;
while((sw==1)&&(P->info!=x)){
if(P->sig!=NULL){
P=P->sig;
}else{
sw=0;
}
}//fin del while
5/23/2018 listas enlazadas
37/75
Pag. 37
if(sw==0){
printf("\n%d no esta en la lista!!...", x);
getch();
return;}
if(P->sig==NULL){
printf("\nNo existen elementos despus de %d!!" , x);
getch();
}
else{AUX=P->sig;
P->sig=AUX->sig;
AUX->sig=NULL;
printf("\n%d ha sido eliminado " , AUX->info);
free(AUX);}
}//fin del else
getch();
}//fin de eliminar despues de
void buscar(void){
5/23/2018 listas enlazadas
38/75
Pag. 38
void buscar(void){
int x,sw;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch(); }
else{AUX=CAB;
printf("\n--BUSQUEDA--\n");
printf("Digite el elememto a buscar...");
scanf("%d", &x);
sw=1;
while((AUX->info!=x)&&(sw==1)&&(AUX!=NULL)){
if(AUX->sig!=NULL)
AUX=AUX->sig;
else
sw=0;
}if(sw==0)
printf("\n%d no esta en la lista!!...\n", x);
else
printf("\n%d si esta en la lista!!...\n", x);
} } //fin de buscar
id d ( id){
5/23/2018 listas enlazadas
39/75
Pag. 39
void ordenar(void){
int temp;
if(CAB==NULL){
printf("\nLista vacia!!...");
getch(); }else{
AUX=CAB;
while(AUX->sig!=NULL){
P=AUX->sig;
while(P!=NULL){
if((AUX->info)>(P->info)){temp=AUX->info;
AUX->info=P->info;
P->info=temp;
}
P=P->sig;}
AUX=AUX->sig;
}
printf("\nLa lista ha sido ordenada!!...");
getch(); } }//fin de ordenar
5/23/2018 listas enlazadas
40/75
Pag. 40
void mostrar(void){
if(CAB==NULL){
printf("\nLista vacia!!...");getch();
return;
}
AUX=CAB;printf("\nContenido de la lista\n");
while(AUX!=NULL){
printf("%d\t",AUX->info);
AUX=AUX->sig;
}getch();
}//fin de mostrar
5/23/2018 listas enlazadas
41/75
Pag. 41
FUNCIONES: MALLOC / NEWEstas funciones, se utilizan para pedirle memoria a lacomputadora, lo cual puede realizarse en las misma funcin de
insertar.Estas funciones devuelven una direccin de memoria que es ladireccin del nuevo nodo, que se guarda, en la variable p.
FUNCIONES: DELETE / FREELa funcin free se usa en C para liberar almacenamiento de unavariable asignada dinmicamente. La orden
free(p);invalida cualquier referencia futura a la variable *p (a menos quese asigne nuevo espacio de memoria a esa variable).
Llamar free(p) hace que quede disponible para reuso elalmacenamiento ocupado por *p, si es necesario.
5/23/2018 listas enlazadas
42/75
Pag. 42
LISTAS DOBLEMENTE ENLAZADAS
En la lista doblemente enlazada, cada elemento
contiene dos punteros, aparte del valoralmacenado en el elemento. Un puntero apunta
al siguiente elemento de la lista y el otro puntero
apunta al elemento anterior.
DI DI DI
CAB
DerechoDatoIzquierdo
NODO
LISTA
5/23/2018 listas enlazadas
43/75
Pag. 43
OPERACIONES
INSERTAR
ELIMINAR
D I
DI
D DI I
5/23/2018 listas enlazadas
44/75
Pag. 44
SINTAXIS: DECLARACIN
struct nodo{int info;
nodo *anterior;
nodo *siguiente;};
SiguienteInfoAnterior
NODO
5/23/2018 listas enlazadas
45/75
Pag. 45
OPERACIONES: INSERTAR AL INICIO
10 25 40NULL NULL
1000 1001 1002
CAB
75NULL NULL
AUX
1100
10 25 40NULL NULL
1000 1001 1002
CAB
75NULL
AUX
75 10 25NULL
1100 1000 1001
CAB
40 NULL
1002
CAB
CAB=10AUX->dato=75AUX->ant=NULLAUX->sig=NULL
AUX->sig=CAB=10=dm10=1000
AUX->ant=NULLCAB->ant=AUX=75=dm75=1100
AUX=new(nodo);printf("\nNumero a insertar:");scanf("%d", &AUX->info);
AUX->ant=NULL;AUX->sig=CAB;if(CAB!=NULL){
CAB->ant=AUX;}CAB=AUX;
OPERACIONES: INSERTAR AL FINAL
5/23/2018 listas enlazadas
46/75
Pag. 46
OPERACIONES: INSERTAR AL FINAL10 25 40NULL NULL
1000 1001 1002
CAB
75NULL NULL
AUX
1100
10 25 40NULL
1000 1001 1002
CAB
75 NULL
AUX
10 25 40NULL
1000 1001 1002
CAB
75 NULL
1100
TEMP
10 25 40NULL NULL
1000 1001 1002
CABTEMP
10 25 40NULL NULL
1000 1001 1002
CABTEMP
TEMP
TEMP AUX
TEMP=CAB=10TEMP=TEMP->sig=dm25=1001TEMP=TEMP->sig=dm40=1002
TEMP->sig=AUX=75=dm75=1100AUX->ant=TEMP=40=dm40=1002
struct nodo *TEMP;
AUX=new(nodo);printf("\nNumero a insertar: ") ;scanf("%d", &AUX->info);AUX->ant=NULL;AUX->sig=NULL;
if(CAB==NULL)CAB=AUX;else{
TEMP=CAB;while(TEMP->sig!=NULL){
TEMP=TEMP->sig;
}TEMP->sig=AUX;AUX->ant=TEMP;
}
5/23/2018 listas enlazadas
47/75
Pag. 47
OPERACIONES: INSERTAR ANTES DE
10 25 40NULL NULL
1000 1001 1002
CAB
75NULL NULL
NUEVO
1100
10 25 40NULL
1000 1001 1002
CAB
75
NULL
NUEVO
10 25 75NULL
1000 1001 1100
CAB
40
NULL
1002
TEMP
10 25 40NULL NULL
1000 1001 1002
CABTEMP
TEMP
TEMP NUEVO
P
P
X=40CAB=10NUVO->sig=NULLTEMP=CAB=10
10!=40P=TEMP=10
TEMP=TEMP->sig=dm25=100125!=40
P=TEMP=25TEMP=TEMP->sig=dm40=1002
40!=40
P->sig=NUEVO=dm75=1100NUEVO->sig=TEMP=40=dm40=1002NUEVO->ant=P=25=dm25=1001TEMP->sig=NUEVO=75=dm75=1100
5/23/2018 listas enlazadas
48/75
Pag. 48
OPERACIONES: ELIMINAR AL INICIO
10 25 40
NULL
NULL
1000 1001 1002
CAB
P
10 25 40NULL
1000 1001 1002
CABP
NULL
NULL
TEMP=CAB=10CAB=CAB->sig=dm25=1001CAB->ant=NULL
if(CAB==NULL){
printf("\nLista vacia!!...");
getch(); }
else{
P=CAB;
if(P->sig==NULL)CAB=NULL;
else
CAB=CAB->sig;
printf("\n%d ha sido eliminado",
P->info);
free(P); }
5/23/2018 listas enlazadas
49/75
Pag. 49
OPERACIONES: ELIMINAR AL FINAL
10 25 40NULL NULL
1000 1001 1002
CAB
P
10 25 40NULL
1000 1001 1002
PCAB
NULL
TEMP
10 25 40
1000 1001 1002
TEMPCAB
NULL
P
NULL
NULL
TEMP=CAB=10P=CAB=10
P=TEMP=10
TEMP=TEMP->sig=25=dm25=1001P=TEMP=25TEMP=TEMP->sig=40=dm40=1002P->sig=NULL
if(CAB==NULL){
printf("\nLista vacia!!...");getch();
}
else{
P=CAB;
if(P->sig==NULL)
CAB=NULL;else{
while(P->sig!=NULL){
AUX=P;
P=P->sig;
}
AUX->sig=NULL;}
printf("\n%d ha sido eliminado",
P->info);
free(P);7
5/23/2018 listas enlazadas
50/75
Pag. 50
OPERACIONES: ELIMINAR ANTES DE
10 25 40NULL NULL
1000 1001 1002
CAB
TEMP
10 25 40NULL
1000 1001 1002
PCAB
NULL
TEMP
10 25 40
1000 1001 1002
TEMP
CAB
NULL
P
NULL
P
10 25 40NULL
1000 1001 1002
TEMP
CAB
NULL
P
X=40
TEMP=CAB=10P=CAB=1010!=40
TEMP=P=10P=P->sig=25=dm25=1001
25!=40TEMP=P=25P=P->sig=40=dm40=1002
40!=40
CAB->sig=dm40=1002P->ant=CAB=10
5/23/2018 listas enlazadas
51/75
Pag. 51
PROGRAMA COMPLETO LISTASDOBLEMENTE ENLAZADAS
#include#include
#include
using namespace std;
struct nodo{
int info;
struct nodo *ant;
struct nodo *sig;
};
struct nodo *CAB=NULL,*AUX=NULL, *P=NULL;
int valor;
void insertar(void);
void mostrar(void);
void insertarc(void);
void buscar(void);
void insertad(void);
void submenu (void);
void eliminar(void);
void elimina(void);
void eliminap(void);
void eliminau(void);
void main(){
5/23/2018 listas enlazadas
52/75
Pag. 52
void main(){
int op;
do{
printf("\n--MENU PRINCIPAL--\n");
printf("1.Insertar \n");printf("2.Eliminar \n");
printf("3.Buscar elemento\n");
printf("4.Mostrar\n");
printf("0.Salir\n");
printf("Escoja una opcion: ");scanf("%d",&op);
switch(op){
case 1:submenu(); break;
case 2:eliminar(); break;
case 3:buscar(); break;case 4:mostrar(); break;
}
}while(op!=0);
getch(); }//fin del main
5/23/2018 listas enlazadas
53/75
Pag. 53
void submenu (void){
int opc;
do{ printf("\n--INSERTAR--\n");
printf("1.Insertar al final\n");
printf("2.Insertar al comienzo\n");
printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");scanf("%d",&opc);
switch(opc){
case 1:insertar(); break;
case 2:insertarc(); break;}
}while(opc!=0);
}//fin de submenu
5/23/2018 listas enlazadas
54/75
Pag. 54
void insertar(void){
struct nodo *TEMP;
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->ant=NULL;
AUX->sig=NULL;
if(CAB==NULL){
CAB=AUX;
}else{
TEMP=CAB;
while(TEMP->sig!=NULL){
TEMP=TEMP->sig;
}TEMP->sig=AUX;
AUX->ant=TEMP;
}
}//fin de insertar al final
5/23/2018 listas enlazadas
55/75
Pag. 55
void insertarc(void){
AUX=new(nodo);printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->ant=NULL;
AUX->sig=CAB;if(CAB!=NULL){
CAB->ant=AUX;
}CAB=AUX;
}//fin insertar al comienzo
id li i ( id){
5/23/2018 listas enlazadas
56/75
Pag. 56
void eliminar(void){
int opc;
do{
printf("\n--ELIMINAR--\n");printf("1.Eliminar el elemento\n");
printf("2.Eliminar el primer elemento\n");
printf("3.Eliminar el ultimo elemento\n");
printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");scanf("%d",&opc);
switch(opc){
case 1:elimina(); break;
case 2:eliminap(); break;case 3:eliminau(); break;
}
}while(opc!=0);
}//fin de eliminar
id li i ( id){
5/23/2018 listas enlazadas
57/75
Pag. 57
void elimina(void){
int x, sw=1;
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();}
else{
printf("\nEliminar el
elemento...");
scanf("%d", &x);P=CAB;
while(((P-
>info)!=x)&&(sw==1)){
if((P->sig)!=NULL){
AUX=P;
P=P->sig;}
else
sw=0;
}
if(sw==0){
printf("\n%d no esta en la lista!!...",
x); getch();
}
else{
if(P==CAB)
CAB=CAB->sig;
elseAUX->sig=NULL;
free(P);
printf("\n%d ha sido eliminado", x);
getch();
}}
} //fin de eliminar el elemento
id li i ( id){
5/23/2018 listas enlazadas
58/75
Pag. 58
void eliminap(void){
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();}
else{
P=CAB;
if(P->sig==NULL)
CAB=NULL;else
CAB=CAB->sig;
printf("\n%d ha sido eliminado", P-
>info);free(P);
}
getch();
}// fin de eliminar primero
void eliminau(void){
5/23/2018 listas enlazadas
59/75
Pag. 59
( ){
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();
}
else{
P=CAB;
if(P->sig==NULL)
CAB=NULL;
else{
while(P->sig!=NULL){AUX=P;
P=P->sig;
}
AUX->sig=NULL;
}printf("\n%d ha sido eliminado", P->info);
free(P);
getch();
}
}//fin de eliminar ultimo
void buscar(void){
5/23/2018 listas enlazadas
60/75
Pag. 60
( ){
int x,sw;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch(); }
else{AUX=CAB;
printf("\n--BUSQUEDA--\n");
printf("Digite el elememto a buscar...");
scanf("%d", &x);
sw=1;while((AUX->info!=x)&&(sw==1)&&(AUX!=NULL)){
if(AUX->sig!=NULL)
AUX=AUX->sig;
else
sw=0; }
if(sw==0){printf("\n%d no esta en la lista!!...\n", x);
getch(); }
else{
printf("\n%d si esta en la lista!!...\n", x);
getch(); } } } //fin de buscar
5/23/2018 listas enlazadas
61/75
Pag. 61
void mostrar(void){
if(CAB==NULL){
printf("\nLista vacia!!...");
return;
}
AUX=CAB;
printf("\nContenido de la lista\n");while(AUX!=NULL){
printf("%d\t",AUX->info);
AUX=AUX->sig;
}
getch();
}//fin de mostrar
LISTAS CIRCULARES
5/23/2018 listas enlazadas
62/75
Pag. 62
LISTAS CIRCULARES
Una lista circular es una lista lineal en la que el ltimo nodo a
punta al primero.Las listas circulares evitan excepciones en la operaciones quese realicen sobre ellas. No existen casos especiales, cadanodo siempre tiene uno anterior y uno siguiente.
En algunas listas circulares se aade un nodo especial de
cabecera, de ese modo se evita la nica excepcin posible, lade que la lista est vaca.
5
-4 1
7
CAB
OPERACIONES: INSERTAR AL INICIO
5/23/2018 listas enlazadas
63/75
Pag. 63
OPERACIONES: INSERTAR AL INICIO
10 25 40
1000 1001 1002
CAB
75
AUX
10 25 40
1000 1001 1002
CAB
75
AUX
1100
1100
AUX->sig=AUXAUX->sig=CAB->sig=10=1000
CAB->sig=AUX=75=1100
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->sig=AUX;
if(CAB==NULL)
CAB=AUX;
else{
AUX->sig=CAB->sig;CAB->sig=AUX;
}
OPERACIONES: ELIMINAR UN ELEMENTO
5/23/2018 listas enlazadas
64/75
Pag. 64
OPERACIONES: ELIMINAR UN ELEMENTO
10 25 40
1000 1001 1002
CAB
75
1100
SW=0P
X
10 25 40
1000 1001 1002
CAB
75
1100
SW=0
P
10 25 40
1000 1001 1002
CAB
75
1100
SW=1P
AUX
SW=0 X=40P=CAB=1010!=40
SW=0P=25
25!=40
SW=0P=40
40!=40SW=1
AUX=P->sig=40=1002
P->sig=AUX->sig=75=110040 Eliminado
5/23/2018 listas enlazadas
65/75
Pag. 65
void elimina(void){
int x, sw=0;
if(CAB==NULL){
printf("\nLista vacia!!...");getch();
}
else{
printf("\nEliminar el
elemento...");scanf("%d",&x);
P=CAB;
while(P->sig!=CAB && !sw){
sw=(P->sig->info==x);
if(!sw)P=P->sig;
}
sw=(P->sig->info==x);
if(sw){
AUX=P->sig;if(CAB==CAB->sig)
CAB=NULL;
else{
if(AUX==CAB){
CAB=P;}P->sig=AUX->sig;
}
free(AUX);
} } getch();
} //fin de eliminar elelemento
OPERACIONES: BUSCAR UN ELEMENTO
5/23/2018 listas enlazadas
66/75
Pag. 66
OPERACIONES: BUSCAR UN ELEMENTO
10 25 40
1000 1001 1002
CAB
75
1100
SW=0 AUX
X
10 25 40
1000 1001 1002
CAB
75
1100
SW=0 AUX
10 25 40
1000 1001 1002
CAB
75
1100
SW=1
AUX
X=40SW=(10==40)=0
AUX=25SW=(25==40)=0
AUX=40SW=1
40 Encontrado
void buscar(void){
5/23/2018 listas enlazadas
67/75
Pag. 67
int x,sw=0;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch(); }
else{
AUX=CAB;
printf("\n--BUSQUEDA--\n");
printf("Digite el elememto a buscar...");
scanf("%d", &x);
while(AUX->sig!=CAB&&!sw){sw=(AUX->sig->info==x);
if(!sw)
AUX=AUX->sig;
}
sw=(AUX->sig->info==x);if(sw)
printf("%d encontrado",x);
else
printf("%d no encontrado",x);
} getch(); } //fin de buscar
OPERACIONES: MOSTRAR ELEMENTOS
5/23/2018 listas enlazadas
68/75
Pag. 68
OPERACIONES: MOSTRAR ELEMENTOS
10 25 40
1000 1001 1002
CAB
75
1100
P
X
10 25 40
1000 1001 1002
CAB
75
1100
P
10 25 40
1000 1001 1002
CAB
75
1100
P
10 25 40
1000 1001 1002
CAB
75
1100
P
P=10Mostrar 10P=25
Mostrar 25P=40Mostrar 40P=40
Mostrar 40
if(CAB==NULL){printf("\nLista vacia!!...");
getch();
return;
}
if(CAB!=NULL){
P=CAB->sig;
do{
printf("%d \t",P->info);
P=P->sig;
}while(P!=CAB->sig);
}
PROGRAMA COMPLETO LISTAS CIRCULARES
5/23/2018 listas enlazadas
69/75
Pag. 69
PROGRAMA COMPLETO LISTAS CIRCULARESSIMPLES
#include
#include#include //free
using namespace std;
struct nodo{
int info;struct nodo *sig;
};
struct nodo *CAB=NULL, *AUX=NULL, *P=NULL;
void mostrar(void);
void insertarc(void);
void buscar(void);
void submenu (void);
void eliminar(void);
void elimina(void);
void main(){
5/23/2018 listas enlazadas
70/75
Pag. 70
void main(){
int op;
do{
printf("\n--MENU PRINCIPAL--\n");
printf("1.Insertar \n");printf("2.Eliminar \n");
printf("3.Buscar elemento\n");
printf("4.Mostrar\n");
printf("0.Salir\n");
printf("Escoja una opcion: ");
scanf("%d",&op);
switch(op){
case 1:submenu(); break;
case 2:eliminar(); break;
case 3:buscar(); break;
case 4:mostrar(); break;}
}while(op!=0);
getch();
}//fin del main
void submenu (void){
5/23/2018 listas enlazadas
71/75
Pag. 71
void submenu (void){
int opc;
do{
printf("\n--INSERTAR--\n");
printf("1.Insertar al comienzo\n");printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");
scanf("%d",&opc);
switch(opc){
case 1:insertarc();
break;
}
}while(opc!=0);
}//fin de submenu
void insertarc(void){
AUX=new(nodo);
printf("\nNumero a insertar: ") ;
scanf("%d", &AUX->info);
AUX->sig=AUX;
if(CAB==NULL)
CAB=AUX;else{
AUX->sig=CAB->sig;
CAB->sig=AUX;
} }//fin insertar al comienzo
5/23/2018 listas enlazadas
72/75
Pag. 72
void eliminar(void){
int opc;
do{printf("\n--ELIMINAR--\n");
printf("1.Eliminar el elemento\n");
printf("0.Volver al menu principal...\n");
printf("Digite una opcion: ");scanf("%d",&opc);
switch(opc){
case 1:elimina(); break;
}
}while(opc!=0);}//fin de eliminar
5/23/2018 listas enlazadas
73/75
Pag. 73
void elimina(void){
int x, sw=0;
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();
}
else{
printf("\nEliminar el
elemento...");
scanf("%d",&x);
P=CAB;
while(P->sig!=CAB && !sw){
sw=(P->sig->info==x);
if(!sw)P=P->sig;
}
sw=(P->sig->info==x);
if(sw){
AUX=P->sig;
if(CAB==CAB->sig)
CAB=NULL;
else{
if(AUX==CAB){
CAB=P;}
P->sig=AUX->sig;
}
free(AUX);
} } getch();
} //fin de eliminar elelemento
void buscar(void){
i t 0
5/23/2018 listas enlazadas
74/75
Pag. 74
int x,sw=0;
if(CAB==NULL) {
printf("\nLista vacia!!...");
getch(); }
else{
AUX=CAB;
printf("\n--BUSQUEDA--\n");
printf("Digite el elememto a buscar...");
scanf("%d", &x);
while(AUX->sig!=CAB&&!sw){sw=(AUX->sig->info==x);
if(!sw)
AUX=AUX->sig;
}
sw=(AUX->sig->info==x);if(sw)
printf("%d encontrado",x);
else
printf("%d no encontrado",x);
} getch(); } //fin de buscar
id t ( id){
5/23/2018 listas enlazadas
75/75
void mostrar(void){
if(CAB==NULL){
printf("\nLista vacia!!...");
getch();return;
}
if(CAB!=NULL){
P=CAB->sig;do{
printf("%d \t",P->info);
P=P->sig;
}while(P!=CAB->sig);
}getch();
}//fin de mostrar