listas enlazadas ing. betty suárez torres

75
Pag. 1 LISTAS ENLAZADAS Ing. Betty Suárez Torres

Upload: sondra

Post on 08-Jan-2016

64 views

Category:

Documents


1 download

DESCRIPTION

LISTAS ENLAZADAS Ing. Betty Suárez Torres. DEFINICIÓN. Una lista enlazada es una colección o secuencia de elementos dispuestos uno detrás de otro, en la que cada elemento se conecta al siguiente elemento por un «enlace» o «puntero». - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 1

LISTAS ENLAZADASIng. Betty Suárez Torres

Page 2: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 2

DEFINICIÓN

Una lista enlazada es una colección o secuencia de elementos dispuestos uno detrás de otro, en la que cada elemento se conecta al siguiente elemento por un «enlace» o «puntero».

Los elementos de una lista se llaman nodos y se componen de dos partes o campos: la primera parte o campo contiene la información y la segunda parte o campo es un puntero (denominado enlace o sgte) que apunta al siguiente elemento de la lista.

a1 a2 a3…..

Page 3: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 3

CLASIFICACIÓN DE LAS LISTAS ENLAZADAS

Simplemente enlazadas

Doblemente enlazadas

Circular simplemente

enlazada

Circular doblemente

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 ((<adelante»).

Cada nodo contiene dos enlaces, uno a su nodo predecesor y el otro a su nodo sucesor. La lista es eficiente tanto en recorrido directo («adelante») como en recorrido inverso («atrás»).

Una lista enlazada simplemente en la que el último elemento (cola) se enlaza al primer elemento (cabeza) de tal modo que la lista puede ser recorrida de modo circular («en anillo»).

Una lista doblemente enlazada en la que el último elemento se enlaza al primer elemento y viceversa. Esta lista se puede recorrer de modo circular (en anillo) tanto en dirección directa («adelante») como inversa («atrás»).

Por cada uno de estos cuatro tipos de estructuras de listas, se puede elegir una implementación basada en arrays (asignación fija o estática) o una implementación basada en punteros (asignación dinámica de memoria mediante punteros).

Page 4: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 4

OPERACIÓN: DECLARAR UN NODO

C++struct nodo{int info;struct nodo *sig;};

info sig

nodo

Page 5: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 5

OPERACIÓN: INSERTAR A INICIO DE LA LISTA

10 25 40

CAB

NULL

1000 1001 1002

75AUX

1100

10 25 40

CAB

NULL

1000 1001 1002

75AUX

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;

Page 6: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 6

OPERACIÓN: 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; }

Page 7: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 7

OPERACIÓN: 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

Page 8: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 8

void insertara(void){struct nodo *Q, *T;int x, sw;if(CAB==NULL){printf("\n¡¡Lista 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("\n¡¡Ha sido insertado!!") ; getch(); }} }

Page 9: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 9

void insertad(void){struct nodo *Q;int x;if(CAB==NULL) {printf("\n¡¡Lista 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("\n¡¡Ha sido insertado!!") ; getch(); } }}

INSERTAR DESPUÉS DE

Page 10: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 10

OPERACIÓN: 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 PNULL

X=40P=CAB=10=dm10=100010!=40 (v) AUX=P=10 P=P->sig=dm25=100125!=40 (v) AUX=P=25 P=P->sig=dm40=100240!=40 (f)AUX->sig=P->sig=NULL

Page 11: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 11

void elimina(void){int x, sw=1;if(CAB==NULL) { printf("\n¡¡Lista 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(); } } }

Page 12: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 12

OPERACIÓN: ELIMINAR EL PRIMER ELEMENTO

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("\n¡¡Lista 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); } }

Page 13: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 13

OPERACIÓN: 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

PAUXCAB

P=CAB=10AUX=P=10P=P->sig=dm25=1001AUX=25P=P->sig=dm40=1002P=P->sig=NULLAUX->sig=NULL

void eliminau(void){if(CAB==NULL) {printf("\n¡¡Lista 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); } }

Page 14: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 14

OPERACIÓN: 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!=x 10!=40 P=AUX=10 AUX=Q=10 Q=Q->sig=dm25=100125!=40 P=AUX=10 AUX=Q=25 Q=Q->sig=dm40=100240!=40P=P->sig=Q=dm40=1002

Page 15: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 15

void elimina_a(void){struct nodo *Q;int x;if(CAB==NULL) {printf("\n¡¡Lista vacia!!..."); getch(); } else{printf("\nEliminar antes de..."); scanf("%d",&x); if(CAB->info==x){printf("\n¡¡No existen elementos antes 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); } } } }

Page 16: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 16

OPERACIÓN: ELIMINAR DESPUÉS 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!=x10!=25 P=P->sig=dm25=100125!=25

AUX=P->sig=dm10=1000P->sig=AUX->sig=NULLAUX->sig=NULL

Page 17: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 17

void elimina_d(void){int x, sw=1;if(CAB==NULL) {printf("\n¡¡Lista vacia!!..."); getch(); }else{printf("\nEliminar despues de..."); 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("\n¡¡No existen elementos después 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 }

Page 18: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 18

OPERACIÓN: BUSCAR

X=40AUX=CAB=10

10!=40 y AUX!=NULL Aux=AUX->sig=dm2525!=40 y AUX!=NULL Aux=AUX->sig=dm4040!=40 y AUX!=NULL

Page 19: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 19

void buscar(void){int x;if(CAB==NULL) {printf("\n¡¡Lista 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(); } } }

Page 20: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 20

OPERACIÓN: 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("\n¡¡Lista vacia!!..."); getch(); return; } AUX=CAB;printf("\nContenido de la lista\n");while(AUX!=NULL){printf("%d\n",AUX->info); AUX=AUX->sig; i++; } getch();}

Page 21: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 21

PROGRAMA COMPLETO LISTAS ENLAZADAS SIMPLES

#include<stdio.h>#include<conio.h>#include<iostream> //freeusing 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);

Page 22: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 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

Page 23: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 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

Page 24: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 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; }

Page 25: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 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("\n¡¡Lista 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; }

Page 26: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 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("\n¡¡Ha sido insertado!!") ;getch();}

}}//fin de insertar antes de

Page 27: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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("\n¡¡Lista vacia!!...");getch();

}else{

AUX=CAB;while((AUX->info!=x)&&(AUX!=NULL)){

AUX=AUX->sig;}

Page 28: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 28

if(AUX==NULL){printf("\n¡¡%d no esta en la lista!!...", x);getch();

}else{

Q->sig=AUX->sig;AUX->sig=Q;printf("\n¡¡Ha sido insertado!!") ;getch();

}}

}//fin de insertar despues de

Page 29: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 30: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 30

void elimina(void){int x, sw=1;if(CAB==NULL){

printf("\n¡¡Lista 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; }

Page 31: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 32: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 32

void eliminap(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 33: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 33

void eliminau(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 34: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 34

void elimina_a(void){struct nodo *Q;int x;printf("\nEliminar antes de...");scanf("%d",&x);if(CAB==NULL){

printf("\n¡¡Lista vacia!!...");getch();

}else{

if(CAB->info==x){printf("\n¡¡No existen elementos antes de %d!!",

x);getch();return;

}else{

Q=CAB;AUX=CAB;P=CAB;

Page 35: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 36: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 36

void elimina_d(void){int x, sw=1;printf("\nEliminar despues de...");scanf("%d",&x);if(CAB==NULL){

printf("\n¡¡Lista vacia!!...");getch();

}else{

P=CAB;while((sw==1)&&(P->info!=x)){

if(P->sig!=NULL){P=P->sig;

}else{

sw=0;}

}//fin del while

Page 37: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 37

if(sw==0){printf("\n¡¡%d no esta en la lista!!...", x);getch();return;}

if(P->sig==NULL){printf("\n¡¡No existen elementos después 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

Page 38: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 38

void buscar(void){int x,sw;if(CAB==NULL) {

printf("\n¡¡Lista 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

Page 39: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 39

void ordenar(void){int temp;if(CAB==NULL){

printf("\n¡¡Lista 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("\n¡¡La lista ha sido ordenada!!...");getch(); } }//fin de ordenar

Page 40: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 40

void mostrar(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 41: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 41

FUNCIONES: MALLOC / NEWEstas funciones, se utilizan para pedirle memoria a la computadora, lo cual puede realizarse en las misma función de insertar.Estas funciones devuelven una dirección de memoria que es la dirección del nuevo nodo, que se guarda, en la variable p.

FUNCIONES: DELETE / FREELa función free se usa en C para liberar almacenamiento de una variable asignada dinámicamente. La orden free(p); invalida cualquier referencia futura a la variable *p (a menos que se asigne nuevo espacio de memoria a esa variable). Llamar free(p) hace que quede disponible para reuso el almacenamiento ocupado por *p, si es necesario.

Page 42: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 42

LISTAS DOBLEMENTE ENLAZADAS

En la lista doblemente enlazada, cada elemento contiene dos punteros, aparte del valor almacenado 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

Page 43: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 43

OPERACIONES

• INSERTAR

• ELIMINAR

D I

DI

D DI I

Page 44: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 44

SINTAXIS: DECLARACIÓN

struct nodo{

int info;

nodo *anterior;

nodo *siguiente;

};

SiguienteInfoAnterior

NODO

Page 45: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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;

Page 46: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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;}

Page 47: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

40NULL

1002

TEMP

10 25 40NULL NULL

1000 1001 1002

CABTEMP

TEMP

TEMP NUEVO

P

P

X=40CAB=10NUVO->sig=NULLTEMP=CAB=10

10!=40 P=TEMP=10 TEMP=TEMP->sig=dm25=100125!=40 P=TEMP=25 TEMP=TEMP->sig=dm40=100240!=40P->sig=NUEVO=dm75=1100NUEVO->sig=TEMP=40=dm40=1002NUEVO->ant=P=25=dm25=1001TEMP->sig=NUEVO=75=dm75=1100

Page 48: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 48

OPERACIONES: ELIMINAR AL INICIO

10 25 40NULL NULL

1000 1001 1002

CABP

10 25 40NULL

1000 1001 1002

CABP

NULL

NULL

TEMP=CAB=10CAB=CAB->sig=dm25=1001CAB->ant=NULL

if(CAB==NULL){printf("\n¡¡Lista 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); }

Page 49: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 49

OPERACIONES: ELIMINAR AL FINAL

10 25 40NULL NULL

1000 1001 1002

CABP

10 25 40NULL

1000 1001 1002

PCAB

NULL

TEMP

10 25 40

1000 1001 1002

TEMPCAB

NULL

PNULL

NULL

TEMP=CAB=10P=CAB=10

P=TEMP=10TEMP=TEMP->sig=25=dm25=1001P=TEMP=25TEMP=TEMP->sig=40=dm40=1002P->sig=NULL

if(CAB==NULL){printf("\n¡¡Lista 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

Page 50: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 50

OPERACIONES: ELIMINAR ANTES DE

10 25 40NULL NULL

1000 1001 1002

CABTEMP

10 25 40NULL

1000 1001 1002

PCAB

NULL

TEMP

10 25 40

1000 1001 1002

TEMPCAB

NULL

P

NULL

P

10 25 40NULL

1000 1001 1002

TEMPCAB

NULL

P

X=40TEMP=CAB=10P=CAB=1010!=40 TEMP=P=10 P=P->sig=25=dm25=100125!=40 TEMP=P=25 P=P->sig=40=dm40=100240!=40CAB->sig=dm40=1002P->ant=CAB=10

Page 51: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 51

PROGRAMA COMPLETO LISTAS DOBLEMENTE ENLAZADAS

#include<stdio.h>#include<conio.h>#include<iostream>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);

Page 52: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 53: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 54: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 55: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 56: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 57: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 57

void elimina(void){ int x, sw=1; if(CAB==NULL){

printf("\n¡¡Lista 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=NULL; free(P); printf("\n%d ha sido eliminado", x); getch();}}} //fin de eliminar el elemento

Page 58: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 58

void eliminap(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 59: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 59

void eliminau(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 60: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 60

void buscar(void){ int x,sw; if(CAB==NULL) {

printf("\n¡¡Lista 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

Page 61: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 61

void mostrar(void){if(CAB==NULL){

printf("\n¡¡Lista 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

Page 62: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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 que se realicen sobre ellas. No existen casos especiales, cada nodo siempre tiene uno anterior y uno siguiente.En algunas listas circulares se añade un nodo especial de cabecera, de ese modo se evita la única excepción posible, la de que la lista esté vacía.

5

-4 1

7

CAB

Page 63: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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=1000CAB->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;

}

Page 64: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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!=40SW=0P=40

40!=40SW=1

AUX=P->sig=40=1002P->sig=AUX->sig=75=110040 Eliminado

Page 65: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 65

void elimina(void){ int x, sw=0; if(CAB==NULL){

printf("\n¡¡Lista 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 el elemento

Page 66: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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=1AUX

X=40SW=(10==40)=0

AUX=25SW=(25==40)=0

AUX=40SW=1

40 Encontrado

Page 67: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 67

void buscar(void){int x,sw=0;if(CAB==NULL) {

printf("\n¡¡Lista 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

Page 68: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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=25Mostrar 25P=40Mostrar 40P=40Mostrar 40

if(CAB==NULL){ printf("\n¡¡Lista vacia!!..."); getch(); return;}if(CAB!=NULL){ P=CAB->sig; do{

printf("%d \t",P->info);P=P->sig;

}while(P!=CAB->sig);}

Page 69: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 69

PROGRAMA COMPLETO LISTAS CIRCULARES SIMPLES

#include<stdio.h>#include<conio.h>#include<iostream> //freeusing 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);

Page 70: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 71: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 72: LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

Page 73: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 73

void elimina(void){ int x, sw=0; if(CAB==NULL){

printf("\n¡¡Lista 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 el elemento

Page 74: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 74

void buscar(void){int x,sw=0;if(CAB==NULL) {

printf("\n¡¡Lista 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

Page 75: LISTAS ENLAZADAS Ing. Betty Suárez Torres

Pag. 75

void mostrar(void){if(CAB==NULL){

printf("\n¡¡Lista 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