listas ligadas en C++ builder

eliza
17 de Octubre del 2003
hola qusiera que me ayudaran a hacer una lista ligada en C++ builder ya la hice en C pero creo que en este lenguaje es diferemte.
Agradeceria que me enviaran unos ejemplo.
gracias

lorm
17 de Octubre del 2003
/*Esta implementacion es en C++ pero lo unico que tienes que hacer en
el builder es cambiar el tipo de entrada y salida de datos por cajas
de texto(Edit->Caption para salida.. StrToInt(Edit->Text) para la entrada)
*/
//lista simplemente ligada implementacion dinamica
#include <stdio.h>
#include <stdlib.h>

#define CIERTO 1;
#define FALSO 0;

//Definici贸n del tipo de dato nodo. (Unidad de la lista)
//En este caso la informaci贸n que se almacena es un s贸lo campo
//de tipo entero
struct nodo {
int dato;
nodo *siguiente;
};

typedef struct nodo Nodo;
typedef int booleano ;

//Declaraci贸n del encabezado de las funciones
void CreaLista(Nodo *lista);
booleano EsVacia(Nodo *lista);
void Inserta(Nodo **lista,int elemento);
void ImprimeLista(Nodo *lista);
Nodo *Encuentra(Nodo *lista,int elemento);
void EliminaLista(Nodo **lista);


void CreaLista(Nodo **lista) {
*lista = 0;
}//CreaLista

booleano EsVacia(Nodo *lista) {
if (lista==0) {
return CIERTO;
}
else {
return FALSO;
}
}//EsVacia

void Inserta(Nodo **lista,int elemento) {
//Se crea un nuevo nodo
Nodo *nuevoNodo;

nuevoNodo = new Nodo;
if (nuevoNodo==0) {
printf("ERROR: Falla al tratar de alojar espacio de memoria...n");
exit(-1);
}
else {
(*nuevoNodo).dato = elemento;
(*nuevoNodo).siguiente = 0;
}

//Se agrega el nuevo nodo a la lista
if ((*lista)==0) {
(*lista) = nuevoNodo;
}
else {
(*nuevoNodo).siguiente = *lista;
(*lista) = nuevoNodo;
}
}//Inserta

void ImprimeLista(Nodo *lista) {
Nodo *auxiliar;

printf("Contenido de la lista:n");
auxiliar = lista;

if (auxiliar==0)
printf("Lista vacia...n");
else
while (auxiliar!=0) {
printf("%dn",(*auxiliar).dato);
auxiliar = (*auxiliar).siguiente;
}
}//ImprimeLista


Nodo *Encuentra(Nodo *lista,int elemento) {
Nodo *auxiliar;

auxiliar = lista;
if (auxiliar==0) {
return 0;
}
else {
while (((*auxiliar).dato!=elemento)&&
(auxiliar!=0))
auxiliar = (*auxiliar).siguiente;

return auxiliar;
}
}//Encuentra

void EliminaLista(Nodo **lista) {
Nodo *auxiliar;

auxiliar = (*lista);
while (auxiliar!=0) {
(*lista) = (*auxiliar).siguiente;
delete auxiliar;
auxiliar = (*lista);
}
}//EliminaLista


//Aplicaci贸n de prueba
void main() {
Nodo *lista;
//int elemento = 1;

CreaLista(&lista);
if (EsVacia(lista))
printf("La lista esta vac铆a...n");
else
printf("La lista no esta vac铆a...n");

for (int i=0; i<10; i++)
Inserta(&lista,i);

ImprimeLista(lista);

if (Encuentra(lista,1)==0)
printf("Elemento no hallado en la listan");
else
printf("Elemento hallado en la listan");

EliminaLista(&lista);
ImprimeLista(lista);
}//main

///Lista doblemente ligada implenetacion dinamica
#include <iostream.h>
#include <stdlib.h>
#include <string.h>

#define CIERTO 1;
#define FALSO 0;


struct nodo {
char estudiante[20];
int calificacion;
nodo *siguiente;
nodo *anterior;
};

typedef struct nodo Nodo;
typedef int booleano ;

void CreaLista(Nodo **lista);
booleano EsVacia(Nodo *lista);
int Longitud(Nodo *lista);
void Inserta(Nodo **lista,char *estudiante,int calificacion);
void EliminaLista(Nodo **lista);
void ImprimeLista(Nodo *lista);
Nodo *Encuentra(Nodo *lista,char *estudiante);
booleano Elimina(Nodo **lista,char *estudiante);

void CreaLista(Nodo **lista) {
*lista = 0;
}//CreaLista

booleano EsVacia(Nodo *lista) {
if (lista==0) {
return CIERTO;
}
else {
return FALSO;
}
}//EsVacia

int Longitud(Nodo *lista) {
Nodo *auxiliar;
int cantidadDeElementos = 0;

if (EsVacia(lista))
return 0;

auxiliar = lista;
while (auxiliar!=0) {
cantidadDeElementos++;
auxiliar = (*auxiliar).siguiente;
}
return cantidadDeElementos;
}//Longitud

void Inserta(Nodo **lista,char *estudiante,int calificacion) {
//Se crea un nuevo nodo
Nodo *nuevoNodo;

nuevoNodo = new Nodo;
if (nuevoNodo==0) {
cout << "ERROR: Falla al tratar de alojar espacio de memoria..."
<< endl;
exit(-1);
}
else {
strcpy((*nuevoNodo).estudiante,estudiante);
(*nuevoNodo).calificacion = calificacion;
(*nuevoNodo).siguiente = 0;
(*nuevoNodo).anterior = 0;
}

//Se agrega el nuevo nodo a la lista
if (!EsVacia(*lista)) {
(*nuevoNodo).siguiente = *lista;
(*(*lista)).anterior = nuevoNodo;
(*lista) = nuevoNodo;
}
else {
(*lista) = nuevoNodo;
}
}//Inserta

void EliminaLista(Nodo **lista) {
Nodo *auxiliar;

auxiliar = (*lista);
while (auxiliar!=0) {
(*lista) = (*auxiliar).siguiente;
delete auxiliar;
auxiliar = (*lista);
}
}//EliminaLista

void ImprimeLista(Nodo *lista) {
Nodo *auxiliar;

cout << "Contenido de la lista:" << endl;
auxiliar = lista;

if (EsVacia(lista))
cout << "Lista vacia..." << endl;
else
while (auxiliar!=0) {
cout << ((*auxiliar).estudiante) << endl;
cout << ((*auxiliar).calificacion) << endl;
auxiliar = (*auxiliar).siguiente;
}
}//ImprimeLista

Nodo *Encuentra(Nodo *lista,char *estudiante) {
Nodo *auxiliar;

if (EsVacia(lista)) {
return 0;
}
else {
auxiliar = lista;
while ((auxiliar!=0)&&
(strcmp((*auxiliar).estudiante,estudiante)!=0))
auxiliar = (*auxiliar).siguiente;

return auxiliar;
}
}//Encuentra

booleano Elimina(Nodo **lista,char *estudiante) {
Nodo *auxiliar;

if ((auxiliar=Encuentra(*lista,estudiante))==0) {
return FALSO;
}
else {
//Se trata del primer nodo
if ((*auxiliar).anterior==0) {
(*lista) = (*auxiliar).siguiente;
if ((*lista)!=0)
(*(*lista)).anterior = (*auxiliar).anterior;
delete auxiliar;
return CIERTO;
}
//Se trata del 煤ltimo nodo
if ((*auxiliar).siguiente==0) {
(*((*auxiliar).anterior)).siguiente = (*auxiliar).siguiente;
delete auxiliar;
return CIERTO;
}
else {//Se trata de un nodo intermedio
(*((*auxiliar).anterior)).siguiente = (*auxiliar).siguiente;
(*((*auxiliar).siguiente)).anterior = (*auxiliar).anterior;
delete auxiliar;
return CIERTO;
}
}
}//Elimina

void main() {
Nodo *lista,*listaAprobados;
int longitud;
char nombre[20];
int calificacion;

CreaLista(&lista);
longitud = Longitud(lista);
cout << "La cantidad de elementos en la lista es: " << longitud << endl;

if (EsVacia(lista))
cout << "La lista esta vac铆a..." << endl;

//Se lee una lista de 10 estudiantes
for (int i=0; i<5; i++) {
cout << "Estudiante: " << i << endl;
cout << "Nombre: ";
cin >> nombre;
cout << "Calificaci贸n: ";
cin >> calificacion;
Inserta(&lista,nombre,calificacion);
}
ImprimeLista(lista);

if (Encuentra(lista,"Juan")!=0)
cout << "Elemento hallado en la lista" << endl;

if (Encuentra(lista,"Antonio")!=0)
cout << "Elemento hallado en la lista" << endl;

if (Elimina(&lista,"Juan"))
cout << "Estudiante eliminado..." << endl;

if (Elimina(&lista,"Antonio"))
cout << "Estudiante eliminado..." << endl;

ImprimeLista(lista);

//ConsigueListaAprobados(lista,&listaAprobados);
ImprimeLista(listaAprobados);

EliminaLista(&lista);
//EliminaLista(&listaAprobados);
}//main