Listas Dobles - Simples

Publicado por svegam016, Agosto 05, 2007, 12:37:07

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

svegam016

Buenassss...
Hoy tengo un problemita.... no se que hace a una Lista Doblemente enlazada distinta a una Lista Simple...
la cosa es que tenemos un codigo fuente, y tengo que variarlo de doblemente enlazado a simple... y no se que modificar, porque no quiero cagarlo todo XD...

Esto tengo que presentarlo este martes... por favor !! ayudaa!!


//Listas Dobles Lineales

#include"iostream.h"
#include"conio.h"
#include"stdio.h"
#include<string.h>
#include"ctype.h"

struct nodo{
char caracter;
nodo *ante;
nodo *sgte;
};

char X [30]; // Crea una variable del tipo de elemento
void ListaVacia ( nodo *& );//Inicializa la lista

int EsVacia( nodo *); // Devuelve TRUE si la lista es vacia

nodo *ConstNodo ( char ); // Construye el nodo

void Insertar( nodo *&cab, char);

void Concatenar(nodo *&, nodo*, nodo*);

void InsertaDato( nodo*&, char);// Inserta un elemento de tipo entero al final de la Lista

//void Comparar(nodo *,nodo *);

void Copiar(nodo*,int,int,nodo*&);

void EliminaIesimo(int, nodo*&);// Elimina un elemento segun la posicion digitada

void Cortar(nodo*&,int,int,nodo*&);

char Dato( nodo *, nodo *);// Devuelve el dato del nodo de una direccion dada.


/*-------- O P E R A C I O N E S D E L A A P L I C A C I O N
--------------*/

char CaptureDato(); // Captura un dato del teclado y lo devuelve para su utilizacion

void AgregarDatoNuevo(nodo *&cab);

void CopiaUsuario(nodo *, nodo*&);

void CortarUsuario(nodo *&,nodo*&);

void MostrarLista(nodo *cab);
/*------------------------------------------------------------------------------*/

int main ()
{//Inicia main

clrscr();
cout<<"\n\n\n\n\n\n\n\t\t\tProyecto # 1 Listas Doblemente Enlazadas";
getch();
nodo *L1; // Se define una lista L1
nodo *L2; // Se define una lista L2
nodo *L3; // Se define una lista L3
ListaVacia (L1);// Se inicializa la lista
ListaVacia (L2);// Se inicializa la lista
ListaVacia (L3);// Se inicializa la lista
char opcion;
do{
clrscr();
opcion =' ';
cout<< "\t\tOpciones:\n\n"<<endl;
cout<< "\t\t( A ) Ingresar una Palabra\n\n"<<endl;
cout<< "\t\t( B ) Desplegar una Palabra (Lista)\n\n"<<endl;
cout<< "\t\t( C ) Concatenar\n\n"<<endl;
cout<< "\t\t( D ) Copiar caracteres de una Lista\n\n"<<endl;
cout<< "\t\t( E ) Corta caracteres de una Lista\n\n" <<endl;
cout<< "\t\t( F ) Reiniciar\n\n"<<endl;
cout<< "\t\t( S ) Salir del programa\n"<<endl;
cout<< "\t\t OPCION= [ ]\n";
gotoxy(28,24);
cin >> opcion;
clrscr();
switch (opcion){
case 'A':
case 'a': { int op = 0;
clrscr();
cout<<"\n\t\t( 1 ) Palabra 1\n\n";
cout<<"\n\t\t( 2 ) Palabra 2\n\n";
cout<<"\n\t\t( 3 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { AgregarDatoNuevo(L1);
break;}
case 2 : { AgregarDatoNuevo(L2);
break;}
case 3 : { break;}
default : { cout<<"\n\t\tOpcion Invalida";getch();
break;}
}//Fin del switch del case A
break;
}//Fin del case A

case 'B':
case 'b': { int op = 0;
clrscr();
cout<<"\n\t\t( 1 ) Palabra 1\n\n";
cout<<"\n\t\t( 2 ) Palabra 2\n\n";
cout<<"\n\t\t( 3 ) Palabra 3\n\n";
cout<<"\n\t\t( 4 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { MostrarLista(L1);
break; }
case 2 : { MostrarLista(L2);
break; }
case 3 : { MostrarLista(L3);
break; }
case 4 : { break; }
default : { cout<<"\n\t\tOpcion Invalida"; getch();
break;}
}//Fin del switch del case B
break;
}//Fin del case B

case 'c':
case 'C': { int op = 0;
clrscr();
cout<<"\n\t\t( 1 ) Palabra 1 con Palabra 2\n\n";
cout<<"\n\t\t( 2 ) Palabra 2 con Palabra 1\n\n";
cout<<"\n\t\t( 3 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { Concatenar(L3,L1,L2);
break; }
case 2 : { Concatenar(L3,L2,L1);
break; }
case 3 : { break; }
default : { cout<<"\n\t\tOpcion Invalida"; getch();
break;}
}//Fin del switch del case C
break;
}// Fin del case C
case 'd':
case 'D': { int op = 0;
clrscr();
cout<<"\tLos caracteres Copiados de la lista (1 o 2) quedan en la Lista 3\n\n";
cout<<"\n\t( 1 ) Copiar de la Palabra 1\n\n";
cout<<"\n\t( 2 ) Copiar de la Palabra 2\n\n";
cout<<"\n\t( 3 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { CopiaUsuario(L1,L3);
break; }
case 2 : { CopiaUsuario(L2,L3);
break; }
case 3 : { break; }
default : { cout<<"\n\t\tOpcion Invalida"; getch();
break;}
}//Fin del switch del case D
break;
} //Fin del case D
case 'e':
case 'E': { int op = 0;
clrscr();
cout<<"\tLos caracteres Cortados de la lista (1 o 2) quedan en la Lista 3\n\n";
cout<<"\n\t( 1 ) Cotar de la Palabra 1\n\n";
cout<<"\n\t( 2 ) Cortar de la Palabra 2\n\n";
cout<<"\n\t( 3 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { CortarUsuario(L1,L3);
break; }
case 2 : { CortarUsuario(L2,L3);
break; }
case 3 : { break; }
default : { cout<<"\n\t\tOpcion Invalida"; getch();
break;}
}//Fin del switch del case E
break;
}//Fin del case E
case 'f':
case 'F': { int op = 0;
clrscr();
cout<<"\tReinicia las Listas (1 , 2 o 3 ) las deja Vacias\n\n";
cout<<"\n\t( 1 ) Lista 1\n\n";
cout<<"\n\t( 2 ) Lista 2\n\n";
cout<<"\n\t( 3 ) Lista 3\n\n";
cout<<"\n\t( 4 ) Regresar al Menu Principal\n\n";
cin>>op;
switch(op){
case 1 : { ListaVacia(L1);
break; }
case 2 : { ListaVacia(L2);
break; }
case 3 : { ListaVacia(L3);
break; }
case 4 : { break; }
default : { cout<<"\n\t\tOpcion Invalida"; getch();
break;}
}//Fin del switch del case F
break;
}//Fin del case F

case 's':
case 'S': { break;}

default : { cout << "La opcion no es valida"; getch();
break;}
};// fin del switch

}while(opcion !='S');

return 0;

}// Fin del main

/*-------- DESARROLLO DE METODOS Y APLICACIONES --------------*/

void ListaVacia(nodo *&cab){ //El parametro se pasa como referencia para ser modificada
cab = NULL;
}// Fin de lista vacia

int EsVacia( nodo *cab){ //El parametro se pasa como de valor, no se podrá modificar
if (cab == NULL)
return 1;
else return 0;
}// Fin de EsVacia

nodo *ConstNodo (char X){
nodo *nuevo;
nuevo = new nodo;
nuevo->caracter = X;
nuevo->sgte=NULL;
nuevo->ante=NULL;
return nuevo;
}//Fin de contnodo


void Insertar( nodo *&cab, char X[30])
{ int cont = 0;
for(int o = 0;o<30;o++){
if(X[o]!= '\0'){
cont++;
}
}
for(int i =0; i<cont;i++){
nodo *nuevo;
char letra = X[i];
nuevo = ConstNodo (letra);

if(cab == NULL)
cab = nuevo;
else{
nodo *aux;
aux = cab;
while(aux->sgte!=NULL)
{
aux = aux->sgte;
}//Fin del While

nuevo->ante = aux;
nuevo->sgte = NULL;
aux->sgte = nuevo;

}//Fin del else

}//Fin del for
}// Fin del insertar

void Concatenar(nodo *&cab3, nodo *cab1, nodo*cab2){
clrscr();
ListaVacia(cab3);
nodo * aux1;
aux1 = cab1;

while(aux1 != NULL){
char letra = aux1->caracter;
nodo *nuevo = ConstNodo(letra);

if(cab3 == NULL)
cab3 = nuevo;
else{
nodo *aux3;
aux3 = cab3;
while(aux3->sgte!=NULL)
{
aux3 = aux3->sgte;
}//Fin del While

nuevo->ante = aux3;
nuevo->sgte = NULL;
aux3->sgte = nuevo;

}//Fin del else

aux1 = aux1->sgte;

}//Fin del while
// Apartir de aqui se agrega la otra palabra según sea el orden del parametro
nodo * aux2;
aux2 = cab2;
while(aux2 != NULL){
char letra = aux2->caracter;
nodo *nuevo = ConstNodo(letra);

if(cab3 == NULL)
cab3 = nuevo;
else{
nodo *aux4;
aux4 = cab3;
while(aux4->sgte!=NULL)
{
aux4 = aux4->sgte;
}//Fin del While

nuevo->ante = aux4;
nuevo->sgte = NULL;
aux4->sgte = nuevo;

}//Fin del else

aux2 = aux2->sgte;

}//Fin del while

cout<<"Las listas se han concatenado";
getch();
}//Fin de Concatenar

void InsertaDato(nodo *&cab, char X)
{
nodo *nuevo;
nuevo = ConstNodo(X);

if(cab == NULL)
cab = nuevo;
else{
nodo *aux;
aux = cab;
while(aux->sgte!=NULL)
{
aux = aux->sgte;
}//Fin del While

nuevo->ante = aux;
nuevo->sgte = NULL;
aux->sgte = nuevo;

}//Fin del else


}//Fin del InsertaDato

void Copiar(nodo *cab,int pos, int cant, nodo*&p){
nodo *aux = cab;
int cont = 1;
if(cab == NULL){
p = cab;
}else{
while(cont < pos){
aux = aux->sgte;
cont++;
}
for(int i =0; i<cant;i++){
char letra = aux->caracter;
InsertaDato(p,letra);
aux= aux->sgte;
}//Fin del for;
aux = aux->sgte;
}//Fin del else
}//Fin del metodo Copiar

void EliminaIesimo(int posicion, nodo*&cab)
{
if(cab == NULL)
{
cout<<"\n\tLISTA ESTA VACIA";getch();
}//fIN DEL IF
else{ nodo*aux;
aux = cab;
int cont = 1;
while((cont != posicion)&&(aux->sgte!= NULL)&&(posicion!=1))
{
aux = aux->sgte;
cont++;
}//Fin del while
if((cont == posicion)||(posicion == 1))
{
//for(int i=0;i<posicion;i++)
aux->ante->sgte = aux->sgte;
aux->sgte->ante =aux->ante;

}else{
cout<<"\n\tLa Posicion digitada no se encontro";
getch();
}
}//Fin del else
}//Fin del EliminaIesimo

void Cortar(nodo *&cab,int pos, int cant, nodo*&p){
clrscr();
nodo *aux = cab;
int cont = 1;
if(cab == NULL){
p = cab;
}else{
while(cont < pos){
aux = aux->sgte;
cont++;
}
for(int i =0; i<cant;i++){
char letra = aux->caracter;
InsertaDato(p,letra);
EliminaIesimo(pos,cab);
aux = aux->sgte;
}//Fin del for
}//Fin del else

}//Fin del metodo Cortar

/*-------- OPERACIONES DE LA APLICACION --------------*/

char CaptureDato() // Captura un dato del teclado y lo devuelve para su utilizacion
{ clrscr();
cout <<"\n\t\tDigite la Palabra: ";// Se leen los datos del teclado
gets(X);
for (int i= 0; i<30;i++){
return X[i];
}
return X[i];
}

void AgregarDatoNuevo(nodo *&cab)
{ clrscr();
CaptureDato();
Insertar(cab ,X);//Se llama al metodo que inserta al inicio

}// Fin de AgregarDato

void CopiaUsuario(nodo*cab,nodo*&cab3){
clrscr();
int posicion;
int cantidad;
cout<<"\n\n\t\tDigite la posicion desde la cual desea copiar: "<<endl;
cin>>posicion;
cout<<"\n\n\t\tDigite la cantidad de caracteres que desea copiar: "<<endl;
cin>>cantidad;
Copiar(cab,posicion,cantidad,cab3);
cout<<"\n\n\t\tLos caracteres han sido copiados a la tercera lista";
getch();
}//fin CopiaUsuario

void CortarUsuario(nodo*&cab,nodo*&cab3){
clrscr();
int posicion;
int cantidad;
cout<<"\n\n\t\tDigite la posicion desde la cual desea cortar: "<<endl;
cin>>posicion;
cout<<"\n\n\t\tDigite la cantidad de caracteres que desea cortar: "<<endl;
cin>>cantidad;
Cortar(cab,posicion,cantidad,cab3);
cout<<"\n\n\tLos caracteres han sido cortados y trasladados a la Tercera Lista";
getch();
}//fin CortarUsuario

void MostrarLista(nodo *cab){

clrscr();
if (cab == NULL)
cout <<"LISTA ESTA VACIA";
else{
nodo *aux;
aux = cab;
int x = 1;
while (aux !=NULL) {
cout<<"\n\tnodo # "<<x<<" "<<" : "<<aux->caracter <<endl;
aux = aux->sgte;
x++;
}

}//Fin del else
getch();

}// Fin de DesplegarLista

lugolu

doblemente enlazada posibilita que desde un nodo puedas ir hacia delante o atrás (siempre y cuando no estés en una de las puntas, dado que ahí uno de los punteros es null), a diferencia de la lista simple donde sólo vas en un sentido

para pasar de doble a simple solamente borra todo el comportamiento del puntero *ante
de todo un poco

svegam016

muchas gracias lugolu !!
vamos a ver que sale... porque lo tengo que presentar mañana XD

gracias en serio !
:up: