[C con Clase] lista ciudad-personas
Toni
tsptoni en gmail.com
Sab Abr 10 18:32:54 CEST 2010
Hola buenas tardes,
He escrito un programa para un trabajo, y me ocurren 2 pequeños errores. El
programa en sí funciona, salvo los 2 errores que ahora explico:
El primero es que cuando almaceno una ciudad, lo hace correctamente pero da
el mensaje "La ciudad ya existe", aun asi la añade, y las posteriores
ciudades que añado
funciona correctamente, es decir, si la ciudad realmente existe, dara el
aviso y no la añadira, y si no se encuentra en la lista, la añade y da el
mensaje "añadido correctamente".
El segundo error es cuando quiero almacenar a una persona, si añado una
persona a una ciudad existente, lo hace bien y da el aviso "añadido
correctamente", en cambio,
si digo que añada a una persona a una ciudad que no se encuentra en la
lista, el programa en vez de decir que no existe tal ciudad, lo que hace es
dar un error y se cierra.
He intentado hacer varias modificaciones pero no consigo solucionarlo, este
es el codigo:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
typedef struct nodo* T_persona;
struct nodo{
T_persona pers;
string nombre;
};
typedef struct nodo1* T_ciudad;
struct nodo1{
T_ciudad sig;
T_persona per;
string ciutat;
};
void Imprimir (T_ciudad& datos){
// system("PAUSE");
// cout<<"llega 1";
//prueba para confirmar si le llega la lista en nulo
if (datos==NULL){
cout<<endl<<endl<<"No existe ninguna ciudad ni
persona!!"<<endl<<endl;
}
//parece que el imprimir funciona, pero la lista siempre llega en nulo,
parece fallo de AlmacenarCiudad (solucionado)
if (datos!=NULL){
// system("PAUSE");
// cout<<"llega 2";
T_ciudad aux;
T_persona aux2;
aux=datos;
// system("PAUSE");
// cout<<"llega 3";
while (aux!=NULL){
// system("PAUSE");
// cout<<"llega 4";
aux2=aux->per;
cout<<aux->ciutat<<" ";
while (aux2!=NULL){
// system("PAUSE");
// cout<<"llega 5";
cout<<aux2->nombre<<" ";
aux2=aux2->pers;
}
// system("PAUSE");
// cout<<"llega 6";
cout<<endl;
aux=aux->sig;
}
}
system("PAUSE");
// cout<<"llega fin";
}
void Destruir (T_ciudad& datos){
if (datos!=NULL){
T_ciudad aux;
T_persona aux2;
aux=datos;
while (aux!=NULL){
aux2=aux->per;
while (aux2!=NULL){ //borramos a las personas de la ciudad
aux->per=aux2->pers;
delete aux2;
aux2=aux->per;
}
datos=aux->sig;
delete aux;
aux=datos;
//comprobacion para ver si borra 1 a 1
// Imprimir(datos);
// system("PAUSE");
//correcto, borra de 1 en 1
}
}
}
void Inicializar (T_ciudad& datos){
if (datos!=NULL){
Destruir (datos);
// system("PAUSE");
// cout<<"llega 1";
}
else{
datos = NULL;
// system("PAUSE");
// cout<<"llega 2";
}
cout<<endl<<"Inicializacion correcta"<<endl<<endl;
system("PAUSE");
}
void AlmacenarCiudad (T_ciudad& datos, const string& ciudad, bool& ok){
//La primera vez que añado una ciudad, siempre dice que ya existe,
luego ya funciona
//correctamente, si existe, avisa y no la añade, si no existe, la
añade y da mensaje afirmativo.
T_ciudad aux;
ok=false; //inciamos en false para decir que no hubo cambio, por lo
cual se añadio bien, sino es asi, cambiara el valor.
aux=datos;
if (datos==NULL){
datos=new nodo1;
datos->ciutat=ciudad;
datos->sig=NULL;
aux=datos;
}
while ((aux->sig!=NULL)&& (aux->ciutat!=ciudad)){
aux=aux->sig;
}
if (aux->ciutat==ciudad){
ok=true; //la ciudad ya existe
}
else{
aux->sig = new nodo1;
aux->sig->ciutat=ciudad;
aux->sig->sig=NULL;
}
if (ok==true){ //true y false funcionan correctamente
cout<<"La ciudad ya existe"<<endl<<endl;
}
else{
cout<<"La ciudad se anadio correctamente"<<endl<<endl;
}
system("PAUSE");
}
void AlmacenarPersona (T_ciudad& datos, const string& ciudad, const string&
persona, bool& ok){
if (datos!=NULL){
T_ciudad aux;
T_persona aux2;
aux=datos;
while ((aux!=NULL)&&(aux->ciutat!=ciudad)){
aux=aux->sig;
// system("PAUSE");
}
if (aux->ciutat==ciudad){
ok=true;
if(aux->per!=NULL){
aux2=aux->per;
aux->per=new nodo;
aux->per->nombre=persona;
aux->per->pers=aux2;
// cout<<"bucle persona2";
// system("PAUSE");
}
if (aux->per==NULL){
aux->per=new nodo;
aux2=aux->per;
aux2->nombre=persona;
aux2->pers=NULL;
aux->per=aux2;
}
}
//Si introduzco una ciudad que no existe para
almacenar una persona
//en lugar de decir que no encontro la ciudad, el
programa da error...
if (ok==false){
cout<<"No se ha encontrado la ciudad, no se almaceno la
persona"<<endl;
}
if (ok==true){
cout<<"Se almaceno correctamente"<<endl;
}
}
system("PAUSE");
}
T_persona BuscarPersona (T_ciudad& datos, const string& ciudad, const
string& persona){
if (datos!=NULL){
T_ciudad aux;
T_persona aux2,encontrada;
aux=datos;
while ((aux!=NULL) && (aux->ciutat!=ciudad)){
aux=aux->sig;
}
if (aux->ciutat==ciudad){
aux2=aux->per;
while ((aux2!=NULL)&&(aux2->nombre!=persona)){
aux2=aux2->pers;
}
if (aux2->nombre==persona){
encontrada=aux2;
cout<<encontrada->nombre<<" esta en la lista"<<endl;
system("PAUSE");
return encontrada;
}
}
}
}
char menu()
{
char opcion;
cout << endl;
cout << "Opciones: " << endl<<endl;
cout << "A: Inicializar " << endl;
cout << "B: Imprimir la estructura" << endl;
cout << "C: Destruir todo(Borrar)" << endl;
cout << "D: Crear una ciudad nueva" << endl;
cout << "E: Anadir una persona a una ciudad" << endl;
cout << "F: Buscar a una persona en una determinada ciudad" << endl;
cout << "X: Para finalizar el programa" << endl<<endl;
do {
cin >> opcion;
opcion = toupper(opcion);
} while (!((opcion == 'X') || (('A' <= opcion) && (opcion <= 'F'))));
return opcion;
}
int main ()
{
char opcion;
string ciudad,persona;
bool ok;
T_ciudad datos = NULL;
cout<<"Antonio Sanchez Pineda"<<endl<<"Listas
Ciudades-Personas"<<endl;
do {
opcion = menu();
switch (opcion) {
case 'A': Inicializar(datos);
break;
case 'B': Imprimir(datos);
break;
case 'C': Destruir(datos);
break;
case 'D': cout << "Introduzca una ciudad: " ;
cin >> ciudad;
AlmacenarCiudad(datos,ciudad,ok);
break;
case 'E': cout<<"Introduzca el nombre de la ciudad: ";
cin>>ciudad;
cout<<"Introduzca el nombre de la persona: ";
cin>>persona;
AlmacenarPersona(datos,ciudad,persona,ok);
break;
case 'F': cout << "Introduzca el nombre de la ciudad: ";
cin >> ciudad;
cout<<"Introduzca el nombre de la persona: ";
cin>>persona;
// T_persona encontrada;
BuscarPersona(datos,ciudad,persona);
// if (encontrada!=NULL){
// cout<<encontrada->nombre<<" esta en la
lista"<<endl;
// }
break;
}
}while (opcion != 'X');
system ("PAUSE");
return 0;
}
Muchas gracias y un saludo.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100410/1ec91405/attachment.html>
Más información sobre la lista de distribución Cconclase