Sei sulla pagina 1di 13

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE INGENÍERIA MECÁNICA Y ELÉCTRICA


INGENIERIA EN COMUNICACIONES Y ELECTRONICA

P5 - Ordenamiento y
recorrido de Listas
Doblemente Encadenadas
Estructura y Base de Datos
Alumno: De los rios Navarrete Jorge Luis
Profesor: Dr. Menchaca García Felipe
Objetivos
▪ Entender las principales diferencias entre LSE y LDE.
▪ Identificar varias operaciones de inserción o eliminación de elementos.
▪ Compilar en programa empleando todos los conceptos.
Listas doblemente enlazadas
En definición son parecidas a las listas de enlace simple, compartiendo con esta la
ocupación de memoria que se hace en sincronía de la ejecución del programa.
Una diferencia muy puntual es que el enlace se efectúa con dos punteros, siendo
uno de ellos apuntando hacia el elemento que le antecede y el otro lo hace a su
vez al elemento que le procede.
Diagrama de P5
MENU DE MANEJO DE LA LISTA DOBLEMENTE ENCADENADA

SALIR

RECUPERAR UNA LISTA


ARCHIVADA
PRESENTAR LA LISTA DE
TRABAJO EN UN NODO
INSERTAR UN NODO

ELIMINAR UN NODO
BUSCAR Y VISUALIZAR UN GUARDAR LA LISTA DE
ELEMENTO DE LA LISTA TRABAJO EN UN ARCHIVO

VISUALIZAR EL ELEMENTO VISUALIZAR EL ELEMENTO VISUALIZAR EL ELEMENTO


CREAR UN NODO O REGISTRO
ANTERIOR DE LA LISTA ACTUAL DE LA LISTA SIGUIENTE DE LA LISTA
Código
/* INSTITUTO POLITECNICO NACIONAL #include <iostream>
ESCUELA SUPERIOR DE INGENIERIA MECANICA Y #include <iomanip> // define diferentes manipuladores
ELECTRICA #include <fstream>
UNIDAD ZACATENCO using namespace std;
INGENIERIA EN COMUNICACIONES Y ELECTRONICA
Dr. Felipe Rolando Menchaca Garcia /* Crear los elementos computacionales de la lista:
Estructura del Nodo, apuntador al inicio de la Lista
Estructuras y Bases de Datos y apuntadores auxiliares para recorrer la Lista
Practica 5 */
struct Nodo
PROGRAMACION DE UN SISTEMA DE LISTA DOBLE {
ENCADENADA int IDentidad, Edad;
METODOLOGÍA char *Nombre[30], *Apellidos[50];
1. Definir la estructura del nodo struct Nodo *Sig, *Ant;
2. Construir el procedimiento de inicializacion de la lista } *Inicio=NULL,*Otro, *Anterior, *Actual;
3. Crear un Metodo para leer listas ya existentes
4. Crear un Nodo o Registro
5. Buscar y Visualizar un elemento de la Lista
6. Visualizar el siguiente elemento de la Lista
7. Visualizar el anterior elemento de la Lista
8. Crear el procedimiento de insersion
9. Crear el procedimiento de eliminacion
10. Guardar la Lista en un archivo
11. Crear un Menu de Trabajo

*/
/* Bibliotecas requeridas */
void CrearNodo() // Busqueda de la posicion de insercion ordenada
{ Otro = Inicio;
/* Con asignacion dinamica de memoria crear el nodo while ((Otro->Sig != NULL)&&(Otro->IDentidad < NodoI-
Capturar los datos del nodo y >IDentidad))
los campos Ant y Sig inicializarlos con NULL {
*/ Anterior = Otro;
cout <<"Procedo a crear un nodo \n"; cin.get(); Otro = Otro->Sig;
}
/*Para ello le tenemos que asignar memoria*/ // Salida de la busqueda con el apuntador Otro
Otro = new(Nodo); if (Otro->IDentidad >= NodoI->IDentidad)
if (Otro == NULL) {cout << "Error de asignacion \n"; {
cin.get();} if(Otro == Inicio)
else { // Caso de insercion al inicio de la Lista
{ // Creado el nodo procedemos a capturar los datos Inicio = NodoI;
cout << "\nIntroduce IDentidad:\t"; cin >> Otro->IDentidad; NodoI->Sig = Otro;
cout << "\nIntroduce Nombre:\t"; cin >> (char *)Otro->Nombre; NodoI->Ant =
cout << "\nIntroduce Apellidos:\t"; cin >> (char *)Otro->Apellidos; NULL;
cout << "\nIntroduce edad:\t\t"; cin >> Otro->Edad; Otro->Ant =
Otro->Sig = NULL; // Iniciamos los apuntadores a los nodos siguiente NodoI;
Otro->Ant = NULL; // y anterior con NULL }
} else
} { // Caso de insercion entre medio de la Lista
/* Metodo para insertar un nuevo Nodo o Registro en la Lista*/ Anterior->Sig = NodoI; NodoI->Sig =
void Insertar(struct Nodo *NodoI) Otro;
{ NodoI->Ant = Anterior;
Actual = NodoI; Anterior = NULL; // Inicializar Otro->Ant = NodoI;
apuntadores Anterior y Actual }
if (Inicio == NULL) }
{Inicio = NodoI;} // Caso de
insertar el primer nodo o elemento
else
{
// Caso de inserción al final de la Lista int ID;
else { Otro->Sig = NodoI; NodoI->Ant = Otro; Anterior Anterior = NULL; Actual = Inicio; Otro = Actual->Sig;
= Otro;} //Inicilizacion de apuntadores
} cout <<"Identidad del elemento que quieres buscar: \n\t";
cout <<"Ap de Inicio de la Lista = " << hex << cin >> ID;
Inicio << endl
<<"Nodo insertado = " << dec << NodoI- while ((Otro != NULL)&&(Actual->IDentidad != ID))
>IDentidad << endl; // Detener la búsqueda
if (NodoI == Inicio)cout <<"Nodo Anterior = NO HAY\n"; // Si se llego al final de la Lista
else cout << "Nodo anterior = " << Anterior->IDentidad << // O se encontro el elemento buscado
endl; {
if (NodoI->Sig == NULL) cout <<"Nodo Siguiente = NO Anterior = Actual;
HAY\n"; Actual = Otro;
else cout <<"Nodo siguiente = "<< Otro->IDentidad; Otro = Actual->Sig;
}
cin.get(); if (Actual->IDentidad != ID)
} {cout <<"No se encuentra el elemento en la
/* Procedimiento para Visualizar un elemento de la Lista*/ Lista\n"; cin.get();}
void Visualizar() else Visualizar();
{ }
cout <<"Identidad:\t" << Actual->IDentidad <<"\n"
<<"Nombre:\t\t" << (char *)Actual->Nombre <<"\n"
<<"Apellidos:\t" << (char *)Actual->Apellidos <<"\n"
<<"Edad:\t\t" << Actual->Edad <<"\n";
cin.get();
}
/* Metodo para Buscar y Visualizar un Nodo o Registro de la
Lista por medio de su IDentificador*/

void Buscar()
{
void VisSiguiente() // Si se llego al final de la Lista
{ // O se encontró el elemento a eliminar
if (Actual->Sig!=NULL) {
{ Anterior = Actual;
Actual = Actual->Sig; Actual = Otro;
Visualizar(); Otro = Actual->Sig;
} }
else if (Actual->IDentidad != ID)
cout <<"Ya no hay un siguiente elemento en la Lista\n"; {printf("No se encuentra el elemento en la Lista\n")
cin.get(); getchar();}
} else
{
void VisAnterior() if (Otro != NULL) Otro->Ant = Actual->Ant;
{ if (Actual == Inicio)
if (Actual->Ant!=NULL) {Inicio = Actual->Sig; Inicio->Sig = Otro; }
{ else
Actual = Actual->Ant; {Anterior->Sig = Actual->Sig; }
Visualizar(); delete Actual;
} }
else
cout << "Ya no hay un elemento anterior en la Lista\n"; cin.get();
cin.get(); }
}
/* Metodo para eliminar un Nodo o Registro de la Lista*/
void Eliminar()
{
int ID;
Anterior = NULL; Actual = Inicio; Otro = Actual->Sig;
//Inicilizacion de apuntadores
cout << "Identidad del elemento que quieres eliminar: \n\t";
cin >> ID;
while ((Otro != NULL)&&(Actual->IDentidad != ID)) // Detener la búsqueda
void Listar() // Creado el nodo procedemos a recuperar los datos
{ Otro->Sig = NULL;// Iniciamos el apuntador al siguiente nodo con
Otro = Inicio; NULL
cout << "Identificador\t Nombre\t\t\t Apellidos\t\t Edad\n"; MiArchivo >> setw(5) >> Otro->IDentidad // Recupera IDentidad
while (Otro != NULL) >> setw(24) >> (char *)Otro->Nombre // Recupera Nombre
{ >> setw(24) >> (char *)Otro->Apellidos // Recupera Apellidos
cout.setf(ios::left); >> setw(3) >> Otro->Edad; // Recupera edad
cout << " " << setw(10) << Otro->IDentidad cout << "Nodo insertado = " << Otro->IDentidad << endl;
<< setw(24) << (char *)Otro->Nombre Insertar(Otro); }}
<< setw(24) << (char *)Otro->Apellidos MiArchivo.close();
<< setw(3) << Otro->Edad << endl; cin.get();}
/* Metodo para para guardar una lista */
Otro = Otro->Sig; void GuardarLista() {
} Actual = Inicio;
cin.get(); char ARCH[80];
} cout<<"NOMBRE DEL ARCHIVO DE SALIDA?\n";
/* Metodo para para leer una lista archivada*/ cin >> (char *)ARCH;
void RecuperarLista() ofstream MiArchivo(ARCH);
{ if (MiArchivo.bad()){
char ARCH[80]; cout<<"No se pudo crear el archivo\n";
cout << "NOMBRE DEL ARCHIVO DE ENTRADA?\n"; return; }
cin >> (char *)ARCH;
ifstream MiArchivo(ARCH); while(Actual != NULL) // Si hay datos en la Lista los guarda
if (MiArchivo.bad()) {
{ // Se guardan los datos del nodo Actual y se pasa al siguiente
cout <<"No existe el archivo\n"; MiArchivo << setw(5) << Actual->Identidad // Guarda IDentidad
cin.get(); << setw(24) << (char *)Actual->Nombre // Guarda Nombre
return; << setw(24) << (char *)Actual->Apellidos// Guarda Apellidos
} << setw(3) << Actual->Edad; // Guarda edad
while(!MiArchivo.eof()) if (Actual->Sig != NULL) MiArchivo << endl;
{ Actual = Actual->Sig; // Iniciamos el apuntador al siguiente
Otro = new(Nodo); nodo con NULL
if (Otro == NULL) {cout <<"Error de Construcción \n"; }
cin.get();} MiArchivo.close();
else }
{
int main() switch (Comando)
{ {
system("color a"); case 'R': {RecuperarLista(); break;}
int Comando; case 'N': {CrearNodo(); break;}
while (Comando != 'S') case 'V': {Visualizar(); break;}
{ case 'F': {VisSiguiente(); break;}
cout<<"Acciona la tecla <FIN DE LINEA> para case 'A': {VisAnterior(); break;}
continuar..."; case 'B': {Buscar(); break;}
getchar(); case 'I': {Insertar(Otro); break;}
system("cls"); case 'E': {Eliminar(); break;}
cout<<"\n\n\tMENU DE MANEJO DE LA LISTA DOBLEMENTE ENCADENADA\n\n" case 'L': {Listar(); break;}
<<"\tR. Recuperar una lista archivada\n" case 'G': {GuardarLista(); break;}
<<"\tN. Crear un Nodo o Registro\n" case 'S': break;
<<"\tI. Insertar Nodo\n" }
<<"\tB. Buscar y Visualizar un elemento de la Lista\n"
<<"\tV. Visualizar el elemento actual de la Lista\n" }
<<"\tA. Visualizar el elemento anterior de la Lista\n" }
<<"\tF. Visualizar el siguiente elemento de la Lista\n"
<<"\tE. Eliminar Nodo\n"
<<"\tL. Presentar la Lista de trabajo en pantalla\n"
<<"\tG. Guardar la Lista de trabajo en un archivo\n"
<<"\tS. Salir\n";
scanf("%d", &Comando);
Comando = getchar();
Capturas