1 / 75

LISTAS ENLAZADAS Ing. Betty Suárez Torres

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

sondra
Download Presentation

LISTAS ENLAZADAS Ing. Betty Suárez Torres

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. LISTAS ENLAZADAS Ing. Betty Suárez Torres

  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.

  3. CLASIFICACIÓN DE LAS LISTAS ENLAZADAS 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).

  4. OPERACIÓN: DECLARAR UN NODO C++ struct nodo{ int info; struct nodo *sig; }; info sig nodo

  5. OPERACIÓN: INSERTAR A INICIO DE LA LISTA 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; CAB=10=DM10=1000 AUX->DATO=75 AUX->SIG=NULL AUX->SIG=CAB=10=DM10=1000 CAB=AUX=10=DM10=1000

  6. OPERACIÓN: INSERTAR AL FINAL DE LA LISTA 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;} P=CAB=10=dm10=1000 P->sig=25=dm25=1001 P->sig=40=dm40=1002 P->sig=AUX=75=dm75=1100

  7. OPERACIÓN: INSERTAR ANTES DE X=25 AUX=CAB=10=DM10=1000 10!=25 (v) T=AUX=10 AUX=AUX->sig=40=dm25=1001 25!=25 (f) T->sig=Q=75=dm75=1100 Q=Q->sig=AUX=25=dm25=1001

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

  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

  10. OPERACIÓN: ELIMINAR UN ELEMENTO X=40 P=CAB=10=dm10=1000 10!=40 (v) AUX=P=10 P=P->sig=dm25=1001 25!=40 (v) AUX=P=25 P=P->sig=dm40=1002 40!=40 (f) AUX->sig=P->sig=NULL

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

  12. OPERACIÓN: ELIMINAR EL PRIMER ELEMENTO 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);} } P=CAB=10 CAB=CAB->sig=dm25=1001

  13. OPERACIÓN: ELIMINAR ÚLTIMO ELEMENTO 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);}} P=CAB=10 AUX=P=10 P=P->sig=dm25=1001 AUX=25 P=P->sig=dm40=1002 P=P->sig=NULL AUX->sig=NULL

  14. OPERACIÓN: ELIMINAR ANTES DE X=40 Q=CAB=10 AUX=CAB=10 P=CAB=10 Q->info!=x 10!=40 P=AUX=10 AUX=Q=10 Q=Q->sig=dm25=1001 25!=40 P=AUX=10 AUX=Q=25 Q=Q->sig=dm40=1002 40!=40 P=P->sig=Q=dm40=1002

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

  16. OPERACIÓN: ELIMINAR DESPUÉS DE X=25 P=CAB=10 P->info!=x 10!=25 P=P->sig=dm25=1001 25!=25 AUX=P->sig=dm10=1000 P->sig=AUX->sig=NULL AUX->sig=NULL

  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}

  18. OPERACIÓN: BUSCAR X=40 AUX=CAB=10 10!=40 y AUX!=NULL Aux=AUX->sig=dm25 25!=40 y AUX!=NULL Aux=AUX->sig=dm40 40!=40 y AUX!=NULL

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

  20. OPERACIÓN: MOSTRAR 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(); } AUX=AUX->sig=dm25=1001 AUX=AUX->sig=dm40=1002 AUX=AUX->sig=NULL

  21. PROGRAMA COMPLETO LISTAS ENLAZADAS SIMPLES 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); #include<stdio.h> #include<conio.h> #include<iostream> //free using namespace std; struct nodo{ int info; struct nodo *sig; }; struct nodo *CAB=NULL, *AUX=NULL, *P=NULL; int valor;

  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

  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

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

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

  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

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

  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

  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

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

  31. 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(); } } } //fin de eliminar el elemento

  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

  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

  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;

  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

  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

  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

  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

  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

  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

  41. Estas 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: MALLOC / NEW FUNCIONES: DELETE / FREE La 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.

  42. 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. Izquierdo Dato Derecho LISTAS DOBLEMENTE ENLAZADAS I D I D I D LISTA CAB NODO

  43. I D OPERACIONES D I • INSERTAR • ELIMINAR D I D I

  44. struct nodo{ int info; nodo *anterior; nodo *siguiente; }; Anterior Info Siguiente SINTAXIS: DECLARACIÓN NODO

  45. OPERACIONES: INSERTAR AL INICIO CAB=10 AUX->dato=75 AUX->ant=NULL AUX->sig=NULL AUX->sig=CAB=10=dm10=1000 AUX->ant=NULL CAB->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;

  46. OPERACIONES: INSERTAR AL FINAL 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; } TEMP=CAB=10 TEMP=TEMP->sig=dm25=1001 TEMP=TEMP->sig=dm40=1002 TEMP->sig=AUX=75=dm75=1100 AUX->ant=TEMP=40=dm40=1002

  47. OPERACIONES: INSERTAR ANTES DE X=40 CAB=10 NUVO->sig=NULL TEMP=CAB=10 10!=40 P=TEMP=10 TEMP=TEMP->sig=dm25=1001 25!=40 P=TEMP=25 TEMP=TEMP->sig=dm40=1002 40!=40 P->sig=NUEVO=dm75=1100 NUEVO->sig=TEMP=40=dm40=1002 NUEVO->ant=P=25=dm25=1001 TEMP->sig=NUEVO=75=dm75=1100

  48. OPERACIONES: ELIMINAR AL INICIO 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);} TEMP=CAB=10 CAB=CAB->sig=dm25=1001 CAB->ant=NULL

  49. OPERACIONES: ELIMINAR AL FINAL 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 TEMP=CAB=10 P=CAB=10 P=TEMP=10 TEMP=TEMP->sig=25= dm25=1001 P=TEMP=25 TEMP=TEMP->sig=40= dm40=1002 P->sig=NULL

  50. OPERACIONES: ELIMINAR ANTES DE X=40 TEMP=CAB=10 P=CAB=10 10!=40 TEMP=P=10 P=P->sig=25=dm25=1001 25!=40 TEMP=P=25 P=P->sig=40=dm40=1002 40!=40 CAB->sig=dm40=1002 P->ant=CAB=10

More Related