You are on page 1of 5

EJEMPLO LISTAS DOBLES

#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;

// Zona de Declaracin de Constantes

// Zona de Declaracin de Tipos

typedef struct tipo_nodo


{
int dato;
struct tipo_nodo *adelante;
struct tipo_nodo *atras;
};

typedef struct tipo_nodo nodo;

// Zona de Cabeceras de Procedimientos y Funciones


nodo *crearnodo(int ndato, nodo *cabeza);
void insertarLista(nodo *anterior, int ndato);
void eliminar(nodo **cabeza, int ndato);
nodo* buscarLista (nodo * cabeza, int destino);
void imprimirLista (nodo *inicio);
void imprimirListaReves (nodo *inicio);
// void ordenar(nodo *inicio);
void ordenardoblesasc(nodo *inicio);
// variables Globales ordenardoblesasc(nodo *inicio)

// Programa Principal
main()
{
int dato;
int opcion;
nodo *primero=NULL; /*lista vacia*/
nodo *resultado = NULL;
/* lectura de nodos */
do
{
system("cls");//cls();
cout<<"\n *************MENU*************";
cout<<"\n1. Insertar Nodo ";
cout<<"\n2. Buscar Nodo ";
cout<<"\n3. Eliminar Nodo ";
cout<<"\n4. Buscar Nodo e Insertar un Valor despues de el ";
cout<<"\n5. Ordenar ";
cout<<"\n6. Imprimir";
cout<<"\nESCOJA UNA OPCION : ";
cin>>opcion;

switch(opcion)
{
case 1:
do {
cout<<"Ingrese el valor <ingrese 0 para salir> ";
cin>>dato;
if (dato != 0)
{
primero=crearnodo(dato,primero);
}

} while (dato != 0);


break;
case 2:
cout<<"\nIngrese el elemento a buscar";
cin>>dato;
if (dato != 0)
{
resultado = buscarLista (primero,dato);
if (resultado == NULL)
{
cout<<"El elemento no existe en la lista" ;
}
else
{
cout<<"El elemento SI existe en la lista ";
}
}
getch();
break;
case 3:

cout<<"\nIngrese el elemento a eliminar <0 para salir> ";


cin>>dato;
if (dato!= 0)
{
eliminar(&primero,dato);
}
getch();
break;

case 4:
/* lectura de elementos para insertar un nuevo nodo */
do {
cout<<"\nIngrese el elemento a buscar <0 para salir> ";
cin>>dato;
if (dato != 0)
{
resultado = buscarLista (primero,dato);
if (resultado == NULL)
{
cout<<"El elemento no existe en la lista ";
}
else
{
cout<<"Ingrese el valor a insertar :";
cin>>dato;
insertarLista (resultado,dato);

}
}
} while (dato != 0);
break;
case 5:
ordenardoblesasc(primero);
imprimirLista(primero);
getch();
break;
case 6:
imprimirLista(primero);
getch();
break;
}

}while (opcion != 7) ;

getch();
}

// Implementacin de Procedimientos y Funciones


/*INSERCION DE UN ELEMENTO EN EL INICIO DE LA LISTA */

nodo *crearnodo(int ndato, nodo *cabeza)


{

nodo *nuevo;
nuevo=(nodo*)malloc(sizeof(tipo_nodo));
nuevo->dato=ndato;
nuevo->adelante=cabeza;
nuevo->atras=NULL;
if (cabeza!=NULL)
{
cabeza->atras=nuevo;
}
return nuevo;
}
//INSERCION DE UN NUEVO NODO QUE NO ESTA EN LA CABEZA DE LA LISTA

void insertarLista(nodo *anterior, int ndato)


{
nodo *nuevo;
nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->dato=ndato;
if(anterior->adelante!= NULL)
{
anterior->adelante->atras = nuevo ;
}

nuevo->adelante=anterior->adelante;
/*campo atras del siguiente apunta al nodo nuevo creado*/
anterior->adelante=nuevo;
nuevo->atras=anterior;
}

nodo* buscarLista (nodo * cabeza, int datobuscado)


{
nodo * indice;
for (indice=cabeza; indice!=NULL ; indice=indice->adelante)
{
if (datobuscado == indice ->dato)
{
return indice;
}
}
return NULL;
}
//eliminacion de un elemento en una lista doble
void eliminar(nodo **cabeza, int ndato)
{
nodo *actual;
int encontrado=0;
actual=*cabeza;

/*bucle de busqueda*/
while((actual !=NULL)&&(!encontrado))
{
encontrado=(actual->dato == ndato);
if(!encontrado)
actual=actual->adelante;
}
/*enlace de nodo anterior con siguiente*/
if(actual!=NULL)
{
/*se distingue entre que el nodo sea el cabecera o del resto de la lista*/
if(actual==*cabeza)
{
*cabeza=actual->adelante;
if(actual->adelante!=NULL)
actual->adelante->atras=NULL;
}
else if(actual->adelante!=NULL) /*no es el ultimo nodo*/
{
actual->atras->adelante=actual->adelante;
actual->adelante->atras=actual->atras;
}
else /*ultimo nodo*/
{
actual->atras->adelante=NULL;
}
free(actual);
}
}
void imprimirLista (nodo *inicio)
{
cout<<"\nLISTA DE ELEMENTOS DE INICIO A FIN" ;
while (inicio!=NULL)
{
cout<<"\n "<< inicio->dato;
inicio= inicio->adelante;
}
}
void imprimirListaReves (nodo *inicio)
{
nodo * fin;

while (inicio!=NULL)
{
fin = inicio;
inicio= inicio->adelante;
}

/* imprime desde el ultimo nodo al primero */


cout<<"\nLISTA DE ELEMENTOS DESDE FIN A INICIO";
while (fin!=NULL)
{
cout<<"\n "<< fin->dato;
fin= fin->atras;
}
}
void ordenardoblesasc(nodo *inicio)
{
nodo *aux;
nodo *temp;
int vaux;
aux=inicio;
temp=inicio;
aux=inicio;
while (aux!=NULL)
{
temp=aux;
while(temp->adelante!=NULL)
{
temp=temp->adelante;
if(aux->dato>temp->dato)
{
vaux=aux->dato;
aux->dato=temp->dato;
temp->dato=vaux;
}
}
aux=aux->adelante;
}
}

You might also like