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
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
muchas gracias lugolu !!
vamos a ver que sale... porque lo tengo que presentar mañana XD
gracias en serio !
:up: