miércoles, 21 de octubre de 2009

listas doblemente enlazadas como libreria y usando templates c++

Bueno señores no tenia nada que hacer en estas horas hice el otro ejemplo espero que les sirva de gran ayuda a todas aquellas personas que estén estudiando informática y quieran aprender un poco de templates, listas y librerias en un mismo ejemplo.

--------------------------------------------
archivo libListas.h
--------------------------------------------

/*
Name: Alejandro Garcia
Copyright: GPL
Author: Alejandro Garcia
Date: 21/10/2009 19:42
Description: libreria que trabaja con listas doblemente enlazadas
*/

/**
* Clase elemento esta trabaja parecido a un estructura en c
* esta contiene dos punteros(siguiente,anterior) y la variable dato
* ojo si se quiere tener mas datos solo se tiene que agregar mas variables
**/
template
class Elemento{
public:
//Variables de clase con acceso publico
Elemento *siguiente;
Elemento *anterior;
T dato;
//constructor
Elemento(Elemento *n,Elemento *a,T d){
Elemento::siguiente=n;
Elemento::dato=d;
Elemento::anterior=a;
}
};

template
Elemento *insertarElementoAlFinal(Elemento *nodo,T dato){
//declaracion de la instanciacion de la clase Elemento
Elemento *anterior = NULL;
if(nodo==NULL){
// Asignamos a lista un nuevo nodo
nodo = new Elemento(NULL,NULL,dato);
}else{
//en caso contrario se le crea otro nodo a la lista
anterior = nodo;
nodo->siguiente = new Elemento(NULL,anterior,dato);
nodo = nodo->siguiente;
}
return nodo;
}


/**
* Funcion irAPrimerElemento Esta funcion desplaza al programa
* al primer nodo o Elemento de la lista y retorna el nodo.
**/
template
Elemento *irAPrimerElemento(Elemento *nodo){
//bucle que regresa la posicion del programa
//al primer nodo de la lista
while(nodo->anterior!=NULL){
nodo=nodo->anterior;
}
return nodo;
}

/**
* Funcion moverseDeElemento Esta funcion desplaza al programa
* una posicion adelante en la lista de nodos o elementos
* y retorna la nodo al que se posiciono
**/
template
Elemento *moverseDeElemento(Elemento *nodo){
if(nodo->siguiente!=NULL){
nodo=nodo->siguiente;
return nodo;
}
return nodo;
}

/**
* Funcion insertarElementoAlPrincipioesta permite insertar un elemento
* al Principio de la lista la cual recibe el puntero a nodo y el dato a insertar
* y retorna el puntero a la lista de nodos o Elementos resultante
**/
template
Elemento *insertarElementoAlPrincipio(Elemento *nodo,T dato){
Elemento *anterior = NULL;
// Si la lista esta vacia
if(nodo==NULL){
// Asignamos a lista un nuevo nodo de valor v y
// cuyo siguiente elemento es la lista actual
nodo = new Elemento(NULL,NULL,dato);
}else{
//en caso contrario se le crea otro nodo a la lista
anterior = nodo;
nodo->anterior = new Elemento(anterior,NULL,dato);
nodo = nodo->anterior;
}
return nodo;
}

/**
* Funcion eliminarElemento Esta funcion se encarga de eliminar
* un elemento de la lista modificando los apuntadores de la lista
* que esta siendo apuntada por el puntero de nodo si en dado caso la lista
* solo tiene un elemento el puntero nodo pasara a apuntar a NULL
* y por ultimo el puntero nodo es retornado
**/
template
Elemento* eliminarElemento(Elemento *nodo){
//cambiando los punteros del Elemento nodo para su eliminacion
if((nodo->siguiente==NULL) && (nodo->anterior!=NULL)){
nodo->anterior->siguiente=NULL;
nodo=nodo->anterior;
}else if((nodo->anterior==NULL) &&(nodo->siguiente!=NULL)){
nodo->siguiente->anterior=NULL;
nodo=nodo->siguiente;
}else if((nodo->siguiente!=NULL) && (nodo->anterior!=NULL)){
nodo->anterior->siguiente=nodo->siguiente;
nodo->siguiente->anterior=nodo->anterior;
}else if((nodo->anterior==NULL) && (nodo->siguiente==NULL)){
return NULL;
}
return nodo;
}


/**
* Funcion buscarElemento Esta recibe la lista apuntada por nodo
* y el dato de busqueda si es encontrado retorna el nodo que contiene el dato
* si no retorna un NULL
**/
template
Elemento* buscarElemento(Elemento *nodo,T dato){
while(nodo!=NULL){
//si el elemento buscado coincide con el dato
//para la busqueda retorna el nodo con ese dato
if(nodo->dato==dato){
return nodo;
}
if(nodo->siguiente==NULL) break;
nodo=nodo->siguiente;
}
return NULL;
}



--------------------------------------------



--------------------------------------------
archivo lista.cpp
--------------------------------------------

/*
Name: Alejandro Garcia
Copyright: GPL
Author: Alejandro Garcia
Date: 21/10/2009 19:42
Description: libreria que trabaja con listas doblemente enlazadas
*/

#include
using namespace std;
//incluyendo la libreria para trabajar con listas doblemente enlazadas
#include "libListas.h"

int main(){
//el tipo de dato que usa en este momento el Elemento o nodo es char
Elemento *nodo=NULL,*nodoaux=NULL;
int salir=0,i=0;

//ojo aqui con el tipo de dato que usa el Elemento
int entrada=0;

//Ejemplo de insercion de datos en una lista enlazada
while(!salir){
entrada=0;
cout << "Ingrese un elemento o nodo a la lista de tipo entero:"; cin >> entrada;
nodo = insertarElementoAlFinal(nodo,entrada);
cout << "desea salir 1=s/0=n: "; cin >> salir;
}

//Ejemplo de la impresion de una lista en pantalla
//regresando al primer nodo
nodo=irAPrimerElemento(nodo);
cout << "Los Datos Ingresados en la Lista son:" <<>dato <<>siguiente==NULL) break;
//funcion que hace saltar de nodo al programa
nodo=moverseDeElemento(nodo);
}
//Ejemplo de eliminacion de un nodo o Elemento
cout <<>> entrada;
//regresando al primer nodo
nodo=irAPrimerElemento(nodo);
nodoaux=nodo; //realizando una copia del nodo
//usando la funcion de busqueda
nodoaux=buscarElemento(nodoaux,entrada);
if(nodoaux!=NULL){
nodo = eliminarElemento(nodoaux);
cout << "Elemento Eliminado " << nodo="irAPrimerElemento(nodo);" i="0;">dato <<>siguiente==NULL) break;
//funcion que hace saltar de nodo al programa
nodo=moverseDeElemento(nodo);
}
}else{
cout <<>

Ejemplo de listas doblemente enlazadas con objeto y trabajando como libreria c++

aquí les dejo un ejemplo que les puede servir de mucho para comprender el funcionamiento de una librería hecha para un programa que trabaja con listas enlazadas ojo la variables "dato" es un tipo de dato entero que no se puede modificar en un proximo ejemplo montare un ejemplo de la construccion de una libreria con teplates
--------------------------------------------
archivo libListas.h
--------------------------------------------

/*
Name: Alejandro Garcia
Copyright: GPL
Author: Alejandro Garcia
Date: 18/10/2009 19:42
Description: libreria que trabaja con listas doblemente enlazadas
*/

/**
* Clase elemento esta trabaja parecido a un estructura en c
* esta contiene dos punteros(siguiente,anterior) y la variable dato
* ojo si se quiere tener mas datos solo se tiene que agregar mas variables
**/
class Elemento{
public:
//Variables de clase con acceso publico
Elemento *siguiente;
Elemento *anterior;
int dato;
//constructor
Elemento(Elemento *n,Elemento *a, int d){
Elemento::siguiente=n;
Elemento::dato=d;
Elemento::anterior=a;
}
};

/**
* Funcion insertarElementoAlFinal esta permite insertar un elemento
* al final de la lista la cual recibe el puntero a nodo y el dato a insertar
* y retorna el puntero a la lista de nodos o Elementos resultante
**/
Elemento* insertarElementoAlFinal(Elemento *nodo,int dato){
//declaracion de la instanciacion de la clase Elemento
Elemento *anterior = NULL;
if(nodo==NULL){
// Asignamos a lista un nuevo nodo
nodo = new Elemento(NULL,NULL,dato);
}else{
//en caso contrario se le crea otro nodo a la lista
anterior = nodo;
nodo->siguiente = new Elemento(NULL,anterior,dato);
nodo = nodo->siguiente;
}
return nodo;
}

/**
* Funcion irAPrimerElemento Esta funcion desplaza al programa
* al primer nodo o Elemento de la lista y retorna el nodo.
**/
Elemento* irAPrimerElemento(Elemento *nodo){
//bucle que regresa la posicion del programa
//al primer nodo de la lista
while(nodo->anterior!=NULL){
nodo=nodo->anterior;
}
return nodo;
}

/**
* Funcion moverseDeElemento Esta funcion desplaza al programa
* una posicion adelante en la lista de nodos o elementos
* y retorna la nodo al que se posiciono
**/
Elemento* moverseDeElemento(Elemento *nodo){
if(nodo->siguiente!=NULL){
nodo=nodo->siguiente;
return nodo;
}
return nodo;
}

/**
* Funcion insertarElementoAlPrincipioesta permite insertar un elemento
* al Principio de la lista la cual recibe el puntero a nodo y el dato a insertar
* y retorna el puntero a la lista de nodos o Elementos resultante
**/
Elemento* insertarElementoAlPrincipio(Elemento *nodo,int dato){
Elemento *anterior = NULL;
// Si la lista esta vacia
if(nodo==NULL){
// Asignamos a lista un nuevo nodo de valor v y
// cuyo siguiente elemento es la lista actual
nodo = new Elemento(NULL,NULL,dato);
}else{
//en caso contrario se le crea otro nodo a la lista
anterior = nodo;
nodo->anterior = new Elemento(anterior,NULL,dato);
nodo = nodo->anterior;
}
return nodo;
}

/**
* Funcion eliminarElemento Esta funcion se encarga de eliminar
* un elemento de la lista modificando los apuntadores de la lista
* que esta siendo apuntada por el puntero de nodo si en dado caso la lista
* solo tiene un elemento el puntero nodo pasara a apuntar a NULL
* y por ultimo el puntero nodo es retornado
**/
Elemento* eliminarElemento(Elemento *nodo){
//cambiando los punteros del Elemento nodo para su eliminacion
if((nodo->siguiente==NULL) && (nodo->anterior!=NULL)){
nodo->anterior->siguiente=NULL;
nodo=nodo->anterior;
}else if((nodo->anterior==NULL) &&(nodo->siguiente!=NULL)){
nodo->siguiente->anterior=NULL;
nodo=nodo->siguiente;
}else if((nodo->siguiente!=NULL) && (nodo->anterior!=NULL)){
nodo->anterior->siguiente=nodo->siguiente;
nodo->siguiente->anterior=nodo->anterior;
}else if((nodo->anterior==NULL) && (nodo->siguiente==NULL)){
return NULL;
}
return nodo;
}


/**
* Funcion buscarElemento Esta recibe la lista apuntada por nodo
* y el dato de busqueda si es encontrado retorna el nodo que contiene el dato
* si no retorna un NULL
**/
Elemento* buscarElemento(Elemento *nodo,int dato){
while(nodo!=NULL){
//si el elemento buscado coincide con el dato
//para la busqueda retorna el nodo con ese dato
if(nodo->dato==dato){
return nodo;
}
if(nodo->siguiente==NULL) break;
nodo=nodo->siguiente;
}
return NULL;
}

--------------------------------------------



--------------------------------------------
archivo lista.cpp
--------------------------------------------

/*
Name: Alejandro Garcia
Copyright: GPL
Author: Alejandro Garcia
Date: 18/10/2009 19:42
Description: libreria que trabaja con listas doblemente enlazadas
*/

#include
//incluyendo la libreria para trabajar con listas doblemente enlazadas
#include "libListas.h"
using namespace std;

int main(){
//Creando variables y punteros de tipo Elemento
Elemento *nodo=NULL,*nodoaux=NULL;
int salir=0,entrada=0,i=0;

//Ejemplo de insercion de datos en una lista enlazada
while(!salir){
entrada=0;
cout << "Ingrese un elemento o nodo a la lista de tipo entero:"; cin >> entrada;
nodo = insertarElementoAlFinal(nodo,entrada);
cout << "desea salir 1=s/0=n: "; cin >> salir;
}

//Ejemplo de la impresion de una lista en pantalla
//regresando al primer nodo
nodo=irAPrimerElemento(nodo);
cout << "Los Datos Ingresados en la Lista son:" <<>dato <<>siguiente==NULL) break;
//funcion que hace saltar de nodo al programa
nodo=moverseDeElemento(nodo);
}

//Ejemplo de eliminacion de un nodo o Elemento
cout <<>> entrada;
//regresando al primer nodo
nodo=irAPrimerElemento(nodo);
nodoaux=nodo; //realizando una copia del nodo
//usando la funcion de busqueda
nodoaux=buscarElemento(nodoaux,entrada);
if(nodoaux!=NULL){
nodo = eliminarElemento(nodoaux);
cout << "Elemento Eliminado " << nodo="irAPrimerElemento(nodo);" i="0;">dato <<>siguiente==NULL) break;
//funcion que hace saltar de nodo al programa
nodo=moverseDeElemento(nodo);
}
}else{
cout <<>