/*********LISTAS ENLAZADAS********/
//programa que presenta el menu de metodos de desarrollar
// las LISTAS ENLASADAS SIMPLES
DEFINICIÒN
Una lista de enlace simple es una lista enlazada de nodos, donde cada nodo tiene un único campo de enlace. Una variable de referencia contiene una referencia al primer nodo, cada nodo (excepto el último) enlaza con el nodo siguiente, y el enlace del último nodo contiene NULL para indicar el final de la lista. Aunque normalmente a la variable de referencia se la suele llamar top, usted puede elegir el nombre que quiera. La siguiente figura presenta una lista de enlace simple de tres nodos, donde top referencia al nodo A, A conecta con B y B conecta con C y C es el nodo final:
:

//Ejemplo
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
#include<io.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys\stat.h>
#include<io.h>
#include<process.h>
#include<alloc.h>
#include”iomanip.h”
//ESTRUCTURA CON NODOS
typedef struct nodo
{
int num;
struct nodo *sig;
}tipoNodo;
//DECLARACION DE LOS PORTOTIPOS
void menupuntero();
void presentar();
//PARA UZAR LOS PUNTEROS
tipoNodo *crearNuevo();
void crear();
void nuevo();
void modificar();
void buscar();
void eliminacion();
void eliminarcabeza();
void eliminar();
void ordenar();
void as();
void des();
void oras();
void ordes();
void insertar();
void insertar_ordenado();
void insertar_cabeza();
void insertar_final();
void presentar();
tipoNodo *cab;
//OPCION BUSCAR
void busquedaC();
//CONSTANTES
const npun=20;
//FUNCION PRINCIPAL
void main()
{
menupuntero();
}
//CONPARTIMINETO DEL PROYECTO
//MENUS DE PRESENTACION
void menupuntero()
{
textmode(BW80);
cprintf(”ABC”);
char opl=’0′;
do
{
clrscr();
cout<<”\t\t//////////////////////////////////////////\n”;
cout<<”\t\t ***MENU LISTAS ENLAZADAS SIMPLES*** \n”;
cout<<”\t\t \n”;
cout<<”\t\t [1] CREAR \n”;
cout<<”\t\t [2] NUEVO \n”;
cout<<”\t\t [3] MODIFICAR \n”;
cout<<”\t\t [4] BUSCAR \n”;
cout<<”\t\t [5] ELIMINAR \n”;
cout<<”\t\t [6] ORDENAR \n”;
cout<<”\t\t [7] INSERTAR \n”;
cout<<”\t\t [8] PRESENTAR \n”;
cout<<”\t\t [x] SALIR \n”;
cout<<”\t\t/////////////////////////////////////// \n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :crear();break;
case ‘2′ :nuevo(); break;
case ‘3′ :modificar(); break;
case ‘4′ :buscar(); break;
case ‘5′ :eliminacion(); break;
case ‘6′
rdenar(); break;
case ‘7′ :insertar(); break;
case ‘8′ :presentar(); break;
}
}
while(opl!=’x');
}
//PARA EL MANEJO DE LAS LISZTAS ENLAZADAS SIMPLES
//ME PERMITE CREAR CABEZA
void crear()
{
textcolor(4);
clrscr();
cab=crearNuevo();
cout<<”INGRESE CABEZA:\t”;
cin>>cab->num;
cab->sig=NULL;
}
//ME PERMITE INGRESAR UN NUEVO NUMERO
void nuevo()
{
textcolor(41);
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE VALOR:\t”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
{
recorrer= recorrer->sig;
}
recorrer->sig=elem;
elem->sig=NULL;
}
//ESTA OPCION ME PERMINTE MODIFICAR
void modificar()
{
textcolor(42);
clrscr();
tipoNodo * elem,* nuevo;
elem=crearNuevo();
cout<<”INGRESE VALOR QUE SE VA HA MODIFICAR:\t “;
cin>>elem->num;
// elem->sig=NULL;
tipoNodo * recorrer;
recorrer=cab;
while(recorrer->sig == elem)
cout<<”INGRESE NUMERO:\t”;
cin>>nuevo->num;
recorrer=recorrer->sig;
recorrer->sig=elem;
elem->sig=NULL;
}
//ME PERMIOTE BUSCAR
void buscar()
{
textcolor(30);
clrscr();
tipoNodo *elem;
int x;
cout<<”VALOR QUE VA A BUSCAR:\t”;
cin>>x;
while(elem!=NULL && elem->num!=x)
{
elem=elem->sig;
}
}
//ESTE MENU ES DE ELIMINACION
void eliminacion()
{
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;
cout<<”\t\tº***MENU DE FORMAS DE ELIMINACIONº\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- ELIMINAR º\n”;
cout<<”\t\tº 2.- ELIMINAR CABEZA º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :eliminar();break;
case ‘2′ :eliminarcabeza(); break;
}
}
while(opl!=’x');
}
//ME PERMITE ELIMINAR CABEZA
void eliminarcabeza()
{
clrscr();
tipoNodo *aux;
cab=cab->sig;
aux->sig=NULL;
free(aux);
}
//ME PERMITE ELIMINAR UNO DE LOS NUMEROS INGRESADOS
void eliminar()
{
clrscr();
tipoNodo *aux;
int n;
cout<<”INGRESE ELEMENTO QUE VA HA ELIMINAR:\t”;
cin>>n;
if(n==cab->num)
eliminarcabeza();
else{
tipoNodo *ant=cab;
aux=cab->sig;
while((aux!=NULL)&&(aux->num!=n))
{
ant=aux;
aux=aux->sig;
}
if(aux!=NULL)
{
ant->sig=aux->sig;
aux->sig=NULL;
free(aux);
}
else
cout<<”NO SE ENCUENTRA”;
}
}
//ESTA OPCION ES DE ORDENAMIENTO
void ordenar()
{
textcolor(3);
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;
cout<<”\t\tº***MENU FORMAS DE ORDENAMIENTO**º\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- ORDENAMIENTO ASCENDENTE º\n”;
cout<<”\t\tº 2.- ORDENAMIENTO DESCENDENTE º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :as();break;
case ‘2′ :des(); break;
}
}
while(opl!=’x');
}
//ME PERMITE ORDENAR DE FORMA ASCENDENTE
void as()
{
clrscr();
tipoNodo *aux,*aux1;
int b;
aux=cab;
while(aux!=NULL)
{
aux1=aux;
aux1=aux1->sig;
while(aux1!=NULL)
{
if(aux->num>aux1->num)
{
b=aux1->num;
aux1->num=aux->num;
aux->num=b;
aux1=aux1->sig;
}
else
{
aux1=aux1->sig;
}
}
aux=aux->sig;
}
}
void oras()
{
as();
clrscr();
tipoNodo *aux;
int w;
aux = cab;
w=10;
while (aux!= NULL)
{
gotoxy(15,8);cout<<”ORDENACION ASCENDENTE”;
gotoxy(w,10);
cout<< aux->num;
aux = aux->sig;
w=w+5;
}
getch();
}
void des()
{
clrscr();
tipoNodo *aux,*aux1;
int b;
aux=cab;
while(aux1!=NULL)
{
aux1=aux;
aux1=aux1->sig;
while(aux1!=NULL)
{
if(aux->num>aux1->num)
{
b=aux1->num;
aux1->num=aux->num;
aux->num=b;
aux1=aux1->sig;
}
else
{
aux1=aux1->sig;
}
}
aux=aux->sig;
}
}
void ordes()
{
des();
tipoNodo *aux;
int w;
aux = cab;
w=10;
while (aux!= NULL)
{
gotoxy(15,8);cout<<”ORDENACION DESCENDENTE”;
gotoxy(w,10);
cout<< aux->num;
aux = aux->sig;
w=w+5;
}
getch();
}
//ESTA OPCION ME PERMITE INSERTAR
void insertar()
{
textcolor(5);
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;
cout<<”\t\tº***MENU FORMAS DE INSERTAMIENTO**º\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- INSERTAR ORDENADO º\n”;
cout<<”\t\tº 2.- INSERTAR FINAL º\n”;
cout<<”\t\tº 3.- INSERTAR CABEZA º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :insertar_ordenado();break;
case ‘2′ :insertar_final(); break;
case ‘3′ :insertar_cabeza(); break;
}
}
while(opl!=’x');
}
//ME PERMITE INSERTAR UN NUMERO PERO YA ORDENADO
void insertar_ordenado()
{
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE UN VALOR:\t”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
{
recorrer= recorrer->sig;
}
recorrer->sig=elem;
elem->sig=NULL;
as();
oras();
}
//ME PERMITE INSERTAR UN NUMERO AL FINAL
void insertar_final()
{
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE EL VALOR FINAL:\t”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
{
recorrer= recorrer->sig;
}
recorrer->sig=elem;
elem->sig=NULL;
}
//ME PERMITE INSERTAR UNA NUEVA CABEZA
void insertar_cabeza()
{
cab=crearNuevo();
cout<<”INGRESE CABEZA:\t”;
cin>>cab->num;
cab->sig=NULL;
}
/*ESTA OPCION ME PERMITE PRESENTAR TODOS LOS NUMEROS
QUE INGRESE, ELIMINE ORDENE Y INSERTE*/
void presentar()
{
textcolor(6);
clrscr();
tipoNodo *recorrer;
recorrer=cab;
while(recorrer!=NULL)
{
cout<<recorrer->num;
recorrer=recorrer->sig;
}
getch();
}
tipoNodo *crearNuevo()
{
tipoNodo *nodo1;
nodo1 =(tipoNodo*)malloc(sizeof(tipoNodo)) ;
if(!nodo1)
cout<<”No se ha reservado memoria\n”;
return nodo1; //devuelve la direccion de la memoria reservada
}
//**** LISTAS ENLAZADAS DOBLES***//
Definiciones
- Es un tipo de lista enlazada que permite moverse hacia delante y hacia atras.
- Cada nodo de una lista doblemente enlazada tiene dos enlaces, ademas de los campos de datos. Un enlace, el derecho, se utiliza para navegar la lista hacia delante. El otro enlace, el isquierdo, se utiliza para navegar la lista hacia atras.
Ejemplo:
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
#include<io.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys\stat.h>
#include<io.h>
#include<process.h>
#include<alloc.h>
#include”iomanip.h”
//ESTRUCTURA CON NODOS
typedef struct nodo
{
int num;
struct nodo *sig,*ante;
}tipoNodo;
//DECLARACION DE LOS PORTOTIPOS
void menupuntero();
void presentar();
//PARA UZAR LOS PUNTEROS
tipoNodo *crearNuevo();
void crear();
void nuevo();
void modificar();
void buscar();
void eliminacion();
void eliminarcabeza();
void eliminar();
void ordenar();
void as();
void des();
void oras();
void ordes();
void insertar();
void insertar_ordenado();
void insertar_cabeza();
void insertar_final();
void presentar();
tipoNodo *cab;
tipoNodo *cola;
//OPCION BUSCAR
void busquedaC();
//CONSTANTES
const npun=20;
//FUNCION PRINCIPAL
void main()
{
menupuntero();
}
//CONPARTIMINETO DEL PROYECTO
//MENUS PARA LA PRESENTACION
void menupuntero()
{
textmode(BW80);
cprintf(”ABC”);
char opl=’0′;
do
{
clrscr();
cout<<”\t\t/////////////////////////////////\n”;
cout<<”\t\t**MENU LISTAS ENLAZADAS DOBLES \n”;
cout<<”\t\t \n”;
cout<<”\t\t 1: CREAR \n”;
cout<<”\t\t 2: NUEVO \n”;
cout<<”\t\t 3: MODIFICAR \n”;
cout<<”\t\t 4: BUSCAR \n”;
cout<<”\t\t 5: ELIMINAR \n”;
cout<<”\t\t 6: ORDENAR \n”;
cout<<”\t\t 7: INSERTAR \n”;
cout<<”\t\t 8: PRESENTAR \n”;
cout<<”\t\t x: SALIR \n”;
cout<<”\t\t////////////////////////////////\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :crear();break;
case ‘2′ :nuevo(); break;
case ‘3′ :modificar(); break;
case ‘4′ :buscar(); break;
case ‘5′ :eliminacion(); break;
case ‘6′
rdenar(); break;
case ‘7′ :insertar(); break;
case ‘8′ :presentar(); break;
}
}
while(opl!=’x');
}
// CODIGOS PARA EL MANEJO DE LAS LISZTAS ENLAZADAS DOBLES
//ME PERMITE CREAR CABEZA
void crear()
{
textcolor(4);
clrscr();
cab=NULL;
cab=crearNuevo();
cout<<”INGRESE CABEZA:\t”;
cin>>cab->num;
cab->ante=NULL;
cab->sig=NULL;
cola=cab;
}
//ME PERMITE INGRESAR UN NUEVO NUMERO
void nuevo()
{
textcolor(41);
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE VALOR:”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
recorrer= recorrer->sig;
recorrer->sig=elem;
elem->sig=NULL;
}
//ESTA OPCION ME PERMINTE MODIFICAR
void modificar()
{
textcolor(42);
clrscr();
tipoNodo * elem,* nuevo;
elem=crearNuevo();
cout<<”INGRESE VALOR QUE SE VA HA MODIFICAR:\t “;
cin>>elem->num;
// elem->sig=NULL;
tipoNodo * recorrer;
recorrer=cab;
while(recorrer->sig == elem)
cout<<”INGRESE NUMERO:\t”;
cin>>nuevo->num;
recorrer=recorrer->sig;
recorrer->sig=elem;
elem->sig=NULL;
}
//ME PERMITE BUSCAR
void buscar()
{
textcolor(30);
clrscr();
tipoNodo *elem;
int x;
cout<<”VALOR QUE VA A BUSCAR:\t”;
cin>>x;
while(elem!=NULL && elem->num!=x)
{
elem=elem->sig;
}
}
//ESTE MENU ES DE LA FORMAS DE ELIMINACION
void eliminacion()
{
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉ//////////////////////////////////////»\n”;
cout<<”\t\tº***MENU DE FORMAS DE ELIMINACION** º\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- ELIMINAR º\n”;
cout<<”\t\tº 2.- ELIMINAR CABEZA º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈ//////////////////////////////////////\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :eliminar();break;
case ‘2′ :eliminarcabeza(); break;
}
}
while(opl!=’x');
}
//ME PERMITE ELIMINAR CABEZA
void eliminarcabeza()
{
clrscr();
tipoNodo *aux;
cab=cab->sig;
aux->sig=NULL;
free(aux);
}
//ME PERMITE ELIMINAR UNO DE LOS NUMEROS INGRESADOS
void eliminar()
{
clrscr();
tipoNodo *aux;
int n;
cout<<”INGRESE ELEMENTO QUE VA HA ELIMINAR:\t”;
cin>>n;
if(n==cab->num)
eliminarcabeza();
else{
tipoNodo *ant=cab;
aux=cab->sig;
while((aux!=NULL)&&(aux->num!=n))
{
ant=aux;
aux=aux->sig;
}
if(aux!=NULL)
{
ant->sig=aux->sig;
aux->sig=NULL;
free(aux);
}
else
cout<<”NO SE ENCUENTRA”;
}
}
//ESTA OPCION ES DE ORDENAMIENTO
void ordenar()
{
textcolor(3);
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;
cout<<”\t\tº***MENU FORMAS DE ORDENAMIENTO**º\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- ORDENAMIENTO ASCENDENTE º\n”;
cout<<”\t\tº 2.- ORDENAMIENTO DESCENDENTE º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :as();break;
case ‘2′ :des(); break;
}
}
while(opl!=’x');
}
//ME PERMITE ORDENAR DE FORMA ASCENDENTE
void as()
{
clrscr();
tipoNodo *aux,*aux1;
int b;
aux=cab;
while(aux!=NULL)
{
aux1=aux;
aux1=aux1->sig;
while(aux1!=NULL)
{
if(aux->num>aux1->num)
{
b=aux1->num;
aux1->num=aux->num;
aux->num=b;
aux1=aux1->sig;
}
else
{
aux1=aux1->sig;
}
}
aux=aux->sig;
}
}
void oras()
{
as();
clrscr();
tipoNodo *aux;
int w;
aux = cab;
w=10;
while (aux!= NULL)
{
gotoxy(15,8);cout<<”ORDENACION ASCENDENTE”;
gotoxy(w,10);
cout<< aux->num;
aux = aux->sig;
w=w+5;
}
getch();
}
void des()
{
clrscr();
tipoNodo *aux,*aux1;
int b;
aux=cab;
while(aux1!=NULL)
{
aux1=aux;
aux1=aux1->sig;
while(aux1!=NULL)
{
if(aux->num>aux1->num)
{
b=aux1->num;
aux1->num=aux->num;
aux->num=b;
aux1=aux1->sig;
}
else
{
aux1=aux1->sig;
}
}
aux=aux->sig;
}
}
void ordes()
{
des();
tipoNodo *aux;
int w;
aux = cab;
w=10;
while (aux!= NULL)
{
gotoxy(15,8);cout<<”ORDENACION DESCENDENTE”;
gotoxy(w,10);
cout<< aux->num;
aux = aux->sig;
w=w+5;
}
getch();
}
//ESTA OPCION ME PERMITE INSERTAR
void insertar()
{
textcolor(5);
char opl=’0′;
do
{
clrscr();
cout<<”\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;
cout<<”\t\tº***MENU FORMAS INSERTAMIENTO** º\n”;
cout<<”\t\tº º\n”;
cout<<”\t\tº 1.- INSERTAR ORDENADO º\n”;
cout<<”\t\tº 2.- INSERTAR FINAL º\n”;
cout<<”\t\tº 3.- INSERTAR CABEZA º\n”;
cout<<”\t\tº x.- SALIR º\n”;
cout<<”\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy (30,20);cout<<”SELECCIONE OPCION:”;
cin>>opl;
switch(opl)
{
case ‘1′ :insertar_ordenado();break;
case ‘2′ :insertar_final(); break;
case ‘3′ :insertar_cabeza(); break;
}
}
while(opl!=’x');
}
//ME PERMITE INSERTAR UN NUMERO PERO YA ORDENADO
void insertar_ordenado()
{
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE UN VALOR:\t”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
{
recorrer= recorrer->sig;
}
recorrer->sig=elem;
elem->sig=NULL;
as();
oras();
}
//ME PERMITE INSERTAR UN NUMERO AL FINAL
void insertar_final()
{
clrscr();
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE EL VALOR FINAL:\t”;
cin>>elem->num;
nodo *recorrer;
recorrer=cab;
while(recorrer->sig!=NULL)
{
recorrer= recorrer->sig;
}
recorrer->sig=elem;
elem->sig=NULL;
}
//ME PERMITE INSERTAR UNA NUEVA CABEZA
void insertar_cabeza()
{
tipoNodo *elem;
elem=crearNuevo();
cout<<”INGRESE NUEVA CABEZA:”;
cin>>elem->num;
cab->ante = elem;
elem->sig = cab;
elem->ante = NULL;
cab = elem;
}
/*ESTA OPCION ME PERMITE PRESENTAR TODOS LOS NUMEROS
QUE INGRESE, ELIMINE ORDENE Y INSERTE*/
void presentar()
{
textcolor(6);
clrscr();
tipoNodo *recorrer;
recorrer=cab;
while(recorrer!=NULL)
{
cout<<recorrer->num;
recorrer=recorrer->sig;
}
getch();
}
tipoNodo *crearNuevo()
{
tipoNodo *nodo1;
nodo1 =(tipoNodo*)malloc(sizeof(tipoNodo)) ;
if(!nodo1)
cout<<”No se ha reservado memoria\n”;
return nodo1; //devuelve la direccion de la memoria reservada
}