Buenas, vereis tengo una duda con un codigo en c++,la cosa está en que se hacer lo que tengo que hacer, pero no se porque no me lo hace.
Os pongo en situacion, tengo una lista enlazada de listas de vuelos, cada vuelo tiene el codigo del vuelo, el numero de pasajeros que tendrá el avión y un puntero que apuntara a otra lista para los pasajeros, donde estos tendran sus correspondientes campos. Asi tengo una lista con los datos de vuelo, y de cada vuelo una lista con pasajeros.
A la hora de insertar el vuelo, me lo hace bien, pero me inserta otros datos, fui subiendo de nivel, hasta que me di cuenta que el fallo está en el procedimiento del leer la estructura previa a la inserción, ya que siempre me da los mimos valores, pero al insertar me pierde el primer valor,inserta el segundo como primero y el segundo coge unos valores extraños, siempre el mismo 2009095316, eso me hace pensar que es algo sobre punteros, pero como cuando leo aun no llamo a nada, incluse probé mostrando los valores nada más leer los datos pero nada.
Aqui os dejo el codigo.
Código:
/*----------------------------------------------------------------
| Autor: |
| Fecha: Versi?n: 1.0 |
|-----------------------------------------------------------------|
| Descripci?n del Programa: |
| |
| ----------------------------------------------------------------*/
// Incluir E/S y Librer?as Standard
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
// Zona de Declaraci?n de Constantes
const char ENTER='\n';
// Zona de Declaraci?n de Tipos
struct TPasajero
{
string nombre;
int unsigned edad;
string dni;
};
struct TNodoPasajero
{
TPasajero pasajero;
TNodoPasajero *sig;
};
typedef TNodoPasajero *TListaPasajero;
struct TVuelo
{
string cod_vuelo;
int unsigned asientos_lib;
TNodoPasajero *p;
};
struct TNodoVuelo
{
TVuelo vuelo;//
TNodoVuelo *sig;
};
typedef TNodoVuelo *TListaVuelo;
typedef enum {NoError,ErrorMemoriaLlena,ErrorListaVacia,ErrorPasajerosVacios,ErrorElementoNoExiste,ErrorListaPVacia}TError;
// Zona de Cabeceras de Procedimientos y Funciones
char menu();
bool ConfirmaSalida();
TListaVuelo CrearListaVuelo();
TListaPasajero CrearListaPasajero();
void LeerVuelo(TVuelo &vuelo);
void InsertarVuelo(TListaVuelo &l,TVuelo vuelo,TError &error);
void MostrarTodos(TListaVuelo l,TError &error);
//aux
void MostrarVuelo(TListaVuelo l);
void MostrarListaPasajeros(TListaPasajero lP);
void MostrarPasajero(TPasajero lP);
void EliminarVuelo(TListaVuelo &l,string cod,TError &error);
void BorrarPasajeros(TListaPasajero &lP);
void MostrarError(TError error);
// Programa Principal
int main()
{
// Zona de Declaraci?n de Variables del Programa principal
char opcion;
bool salir;
string cod;
TListaVuelo listaV;
TVuelo vuelo;
TError error;
salir = false;
listaV=CrearListaVuelo();
while(!salir)
{
opcion = menu();
cout << endl;
switch(opcion)
{
case 'A': //LeerVuelo(vuelo);
cout << "Introduzca codigo de vuelo: ";
cin >> vuelo.cod_vuelo;
cout << "Introduzca numero de asientos libres: ";
cin >>vuelo.cod_vuelo;
cin.ignore();
cout<<vuelo.cod_vuelo<<endl;
cout << vuelo.asientos_lib<< endl;
InsertarVuelo(listaV,vuelo,error);
break;
case 'B': cout << "Introduzca codigo del vuelo que desea borrar: " << endl;
getline(cin,cod,ENTER);
EliminarVuelo(listaV,cod,error);
break;
case 'C':
break;
case 'F': MostrarTodos(listaV,error);
break;
case 'X': salir = ConfirmaSalida();
break;
}
cout << endl;
MostrarError(error);
cout << endl << endl;
system("Pause"); // Hacer una pausa
system("cls"); // Borrar la Pantalla
}
cout << endl << endl;
cout << "Nombre: ..." << endl;
cout << "Grupo: 1? A (I.T.I. Sistemas)" << endl;
cout << "M?quina: ..." << endl;
cout << endl << endl;
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
// Implementaci?n de Procedimientos y Funciones
char menu()
{
char op;
cout << " A. Insertar vuelo al sistema." << endl;
cout << " B. Eliminar un vuelo del sistema." << endl;
cout << " C. ..." << endl;
cout << " F. Visualizar datos de todos los vuelos." << endl;
//A?adir m?s opciones en caso de que sea necesario
cout << " X. Salir del Programa" << endl;
cout << endl;
cout << "Introduzca su opcion: " ;
op = cin.get();
cin.ignore();
op = toupper(op);
// Completar la condici?n del while si hay m?s opciones
while ( (op !='A') && (op!='B') && (op !='C') &&(op!='D') &&(op!='E') &&(op!='F') &&(op!='G')&&(op!='X') )
{
cout << " Opcion Incorrecta ..." << endl;
cout << endl;
cout << " Introduzca su opcion: " ;
op = cin.get();
cin.ignore();
op = toupper(op);
}
return op;
}
bool ConfirmaSalida()
{
char car;
cout << "?Est? seguro de salir (S/N)?";
cin >> car;
cin.ignore();
car = toupper(car);
return (car=='S');
}
TListaVuelo CrearListaVuelo()
{
return NULL;
}// fin CrearListaVuelo
TListaPasajero CrearListaPasajero()
{
return NULL;
}// fin CrearListaPasajero
void LeerVuelo(TVuelo &v)
{
cout << "Introduzca codigo de vuelo: ";
getline(cin,v.cod_vuelo,ENTER);
cout << "Introduzca numero de asientos libres: ";
cin >>v.cod_vuelo;
cin.ignore();
}// fin leerVuelo
void InsertarVuelo(TListaVuelo &l,TVuelo vuelo,TError &error)
{
//variables
TListaVuelo ptr;
//inicio
if (l==NULL)
{
l=new TNodoVuelo;
if (l==NULL)
{
error=ErrorMemoriaLlena;
}
else
{
error=NoError;
//l->vuelo=vuelo;
l->vuelo.cod_vuelo=vuelo.cod_vuelo;
l->vuelo.asientos_lib=vuelo.asientos_lib;
l->vuelo.p = CrearListaPasajero();
l->sig=NULL;
}
}
else
{
ptr =new TNodoVuelo;
if (ptr==NULL)
{
error=ErrorMemoriaLlena;
}
else
{
error=NoError;
//ptr->vuelo=vuelo;
ptr->vuelo.cod_vuelo=vuelo.cod_vuelo;
ptr->vuelo.asientos_lib=vuelo.asientos_lib;
ptr->vuelo.p = CrearListaPasajero();
ptr->sig=l;
l=ptr;
}
}
}//Fin insertarVuelo
void MostrarTodos(TListaVuelo l,TError &error)
{
//variables
TListaVuelo ptr;
//inicio
if (l==NULL)
{
error=ErrorListaVacia;
}
else
{
error=NoError;
ptr=l;
while (ptr!=NULL)
{
MostrarVuelo(ptr);
ptr=ptr->sig;
}
}
}//fin MostrarTodos
void MostrarVuelo(TListaVuelo l)
{
cout << "Codigo de vuelo: " << l->vuelo.cod_vuelo << endl;
cout << "Asientos libres: " << l->vuelo.asientos_lib << endl;
MostrarListaPasajeros(l->vuelo.p);
cout << endl;
}// fin MostrarVuelo
void MostrarListaPasajeros(TListaPasajero lP)
{
//inicio
TListaPasajero ptr;
//variables
if (lP==NULL)
{
cout << "Lista de pasajeros vacia." <<endl;
}
else
{
ptr=lP;
while(ptr!=NULL)
{
MostrarPasajero(ptr->pasajero);
ptr=ptr->sig;
}
}
}// fin MostrarPasajeros
void MostrarPasajero(TPasajero p)
{
cout << "Nombre Pasajero: " << p.nombre;
cout << "Edad Pasajero: " << p.edad;
cout << "DNI Pasajero: " << p.dni;
cout << endl;
}//fin MostrarPasajeros
void EliminarVuelo(TListaVuelo &l,string cod,TError &error)
{
//variables
TListaVuelo ptr,aux;
bool en;
//inicio
en=false;
if (l==NULL)
{
error=ErrorListaVacia;
}
else
{
if (l->vuelo.cod_vuelo==cod)
{
ptr=l;
l=l->sig;
delete (ptr);
error=NoError;
}
else
{
ptr=l->sig;
while( (ptr!=NULL) && (!en) )
{
if (ptr->sig->vuelo.cod_vuelo==cod)
{
aux=ptr->sig;
ptr->sig=aux->sig;
BorrarPasajeros(aux->vuelo.p);
delete(aux);
error=NoError;
en=true;
}
else
{
ptr=ptr->sig;
}
}
}
}
if (!en)
{
error=ErrorElementoNoExiste;
}
}// fin EliminarVeulo
void BorrarPasajeros(TListaPasajero &lP)
{
//variables
TListaPasajero ptr;
//inicio
while(lP!=NULL)
{
ptr=lP;
lP=lP->sig;
delete(ptr);
}
}//fin borrar Pasajeros
void MostrarError(TError error)
{
switch (error)
{
case NoError: cout << "Operacion realizada con exito";
break;
case ErrorMemoriaLlena: cout << "Memoria Llena";
break;
case ErrorListaVacia: cout << "La lista esta vacia";
break;
case ErrorPasajerosVacios: cout << "No existen pasajeros en el vuelo";
break;
case ErrorElementoNoExiste: cout << "El elemento solicitado no existe";
break;
}
}// fin mostrarError
Tiene mucho codigo pero lo unico a mirar es el LeerVuelo.
Espero que alguien me pueda ayudar.