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

No hay comentarios:

Publicar un comentario