listas enlazadas

Upload: francisco-reina

Post on 13-Oct-2015

28 views

Category:

Documents


0 download

TRANSCRIPT

  • 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