Hola buenas tardes,<div><br></div><div>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:</div><div><br></div><div>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 </div>
<div>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".</div><div><br></div><div>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,</div>
<div>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.</div><div><br></div><div>He intentado hacer varias modificaciones pero no consigo solucionarlo, este es el codigo:</div>
<div><br></div><div><div>#include <iostream></div><div>#include <cstdlib></div><div>#include <string></div><div>using namespace std;</div><div><br></div><div>typedef struct nodo* T_persona;</div><div> struct nodo{</div>
<div> T_persona pers;</div><div> string nombre;</div><div> };</div><div> </div><div><br></div><div>typedef struct nodo1* T_ciudad;</div><div> struct nodo1{</div><div> T_ciudad sig;</div>
<div> T_persona per;</div><div> string ciutat;</div><div> };</div><div> </div><div> </div><div> </div><div>void Imprimir (T_ciudad& datos){</div><div> // system("PAUSE");</div>
<div> // cout<<"llega 1";</div><div> //prueba para confirmar si le llega la lista en nulo </div><div> if (datos==NULL){</div><div> cout<<endl<<endl<<"No existe ninguna ciudad ni persona!!"<<endl<<endl;</div>
<div> }</div><div> //parece que el imprimir funciona, pero la lista siempre llega en nulo, parece fallo de AlmacenarCiudad (solucionado)</div><div> if (datos!=NULL){</div><div> // system("PAUSE");</div>
<div> // cout<<"llega 2"; </div><div> T_ciudad aux;</div><div> T_persona aux2;</div><div> aux=datos;</div><div> // system("PAUSE");</div><div> // cout<<"llega 3";</div>
<div> while (aux!=NULL){</div><div> // system("PAUSE");</div><div> // cout<<"llega 4";</div><div> aux2=aux->per;</div><div> cout<<aux->ciutat<<" ";</div>
<div> while (aux2!=NULL){ </div><div> // system("PAUSE");</div><div> // cout<<"llega 5"; </div><div> cout<<aux2->nombre<<" ";</div>
<div> aux2=aux2->pers;</div><div> }</div><div> // system("PAUSE");</div><div> // cout<<"llega 6";</div><div> cout<<endl; </div><div>
aux=aux->sig; </div><div> } </div><div> } </div><div> system("PAUSE");</div><div> // cout<<"llega fin"; </div><div> }</div><div> </div>
<div> </div><div>void Destruir (T_ciudad& datos){</div><div> </div><div> if (datos!=NULL){</div><div> </div><div> T_ciudad aux;</div><div> T_persona aux2;</div><div> aux=datos;</div><div>
</div><div> while (aux!=NULL){</div><div> aux2=aux->per; </div><div> while (aux2!=NULL){ //borramos a las personas de la ciudad</div><div> aux->per=aux2->pers;</div><div>
delete aux2;</div><div> aux2=aux->per; </div><div> }</div><div> datos=aux->sig;</div><div> delete aux;</div><div> aux=datos;</div><div> </div>
<div> //comprobacion para ver si borra 1 a 1</div><div> </div><div> // Imprimir(datos);</div><div> // system("PAUSE");</div><div> //correcto, borra de 1 en 1</div><div> } </div>
<div> }</div><div> </div><div> } </div><div><br></div><div>void Inicializar (T_ciudad& datos){</div><div> if (datos!=NULL){</div><div> Destruir (datos);</div><div> // system("PAUSE");</div>
<div> // cout<<"llega 1";</div><div> }</div><div> else{ </div><div> datos = NULL;</div><div> // system("PAUSE");</div><div> // cout<<"llega 2";</div>
<div> }</div><div> cout<<endl<<"Inicializacion correcta"<<endl<<endl;</div><div> system("PAUSE"); </div><div> }</div><div> </div><div><br></div><div>void AlmacenarCiudad (T_ciudad& datos, const string& ciudad, bool& ok){</div>
<div> </div><div> //La primera vez que añado una ciudad, siempre dice que ya existe, luego ya funciona </div><div> //correctamente, si existe, avisa y no la añade, si no existe, la añade y da mensaje afirmativo.</div>
<div> </div><div> T_ciudad aux;</div><div> ok=false; //inciamos en false para decir que no hubo cambio, por lo cual se añadio bien, sino es asi, cambiara el valor.</div><div> aux=datos; </div>
<div> </div><div> if (datos==NULL){</div><div> datos=new nodo1;</div><div> datos->ciutat=ciudad;</div><div> datos->sig=NULL;</div><div> aux=datos;</div><div> }</div><div>
while ((aux->sig!=NULL)&& (aux->ciutat!=ciudad)){ </div><div> </div><div> aux=aux->sig; </div><div> }</div><div> if (aux->ciutat==ciudad){</div><div> ok=true; //la ciudad ya existe </div>
<div> }</div><div> else{</div><div> aux->sig = new nodo1; </div><div> aux->sig->ciutat=ciudad;</div><div> aux->sig->sig=NULL; </div>
<div> }</div><div> </div><div> if (ok==true){ //true y false funcionan correctamente</div><div> cout<<"La ciudad ya existe"<<endl<<endl; </div><div> }</div><div>
else{</div><div> cout<<"La ciudad se anadio correctamente"<<endl<<endl; </div><div> }</div><div> system("PAUSE");</div><div> }</div><div> </div><div>void AlmacenarPersona (T_ciudad& datos, const string& ciudad, const string& persona, bool& ok){</div>
<div> </div><div> if (datos!=NULL){</div><div> T_ciudad aux;</div><div> T_persona aux2;</div><div> aux=datos;</div><div> </div><div> while ((aux!=NULL)&&(aux->ciutat!=ciudad)){</div>
<div> aux=aux->sig; </div><div> // system("PAUSE"); </div><div> }</div><div> if (aux->ciutat==ciudad){</div><div> ok=true;</div><div> </div><div>
if(aux->per!=NULL){</div><div> aux2=aux->per;</div><div> aux->per=new nodo;</div><div> aux->per->nombre=persona;</div><div> aux->per->pers=aux2; </div>
<div> // cout<<"bucle persona2";</div><div> // system("PAUSE");</div><div> }</div><div> if (aux->per==NULL){</div><div> aux->per=new nodo;</div>
<div> aux2=aux->per;</div><div> aux2->nombre=persona;</div><div> aux2->pers=NULL;</div><div> aux->per=aux2; </div><div> } </div>
<div> }</div><div> //Si introduzco una ciudad que no existe para almacenar una persona</div><div> //en lugar de decir que no encontro la ciudad, el programa da error... </div>
<div> if (ok==false){</div><div> cout<<"No se ha encontrado la ciudad, no se almaceno la persona"<<endl; </div><div> }</div><div> if (ok==true){</div><div>
cout<<"Se almaceno correctamente"<<endl; </div><div> }</div><div> </div><div> }</div><div> system("PAUSE");</div><div> }</div><div>
</div><div>T_persona BuscarPersona (T_ciudad& datos, const string& ciudad, const string& persona){</div><div> </div><div> if (datos!=NULL){</div><div> T_ciudad aux;</div><div> T_persona aux2,encontrada;</div>
<div> aux=datos;</div><div> </div><div> while ((aux!=NULL) && (aux->ciutat!=ciudad)){</div><div> aux=aux->sig;</div><div> }</div><div> if (aux->ciutat==ciudad){</div>
<div> aux2=aux->per;</div><div> while ((aux2!=NULL)&&(aux2->nombre!=persona)){</div><div> aux2=aux2->pers; </div><div> }</div><div> if (aux2->nombre==persona){</div>
<div> encontrada=aux2;</div><div> cout<<encontrada->nombre<<" esta en la lista"<<endl;</div><div> system("PAUSE");</div><div> return encontrada; </div>
<div> } </div><div> } </div><div> } </div><div> }</div><div><br></div><div><br></div><div><br></div><div><br></div><div>char menu()</div><div>{</div><div> char opcion;</div><div> cout << endl;</div>
<div> cout << "Opciones: " << endl<<endl;</div><div> cout << "A: Inicializar " << endl;</div><div> cout << "B: Imprimir la estructura" << endl;</div>
<div> cout << "C: Destruir todo(Borrar)" << endl;</div><div> cout << "D: Crear una ciudad nueva" << endl;</div><div> cout << "E: Anadir una persona a una ciudad" << endl;</div>
<div> cout << "F: Buscar a una persona en una determinada ciudad" << endl;</div><div> cout << "X: Para finalizar el programa" << endl<<endl;</div><div> do {</div>
<div> cin >> opcion; </div><div> opcion = toupper(opcion);</div><div> } while (!((opcion == 'X') || (('A' <= opcion) && (opcion <= 'F'))));</div><div> return opcion;</div>
<div>}</div><div><br></div><div>int main ()</div><div>{ </div><div> char opcion;</div><div> string ciudad,persona;</div><div> bool ok;</div><div> T_ciudad datos = NULL;</div><div> </div><div> cout<<"Antonio Sanchez Pineda"<<endl<<"Listas Ciudades-Personas"<<endl;</div>
<div> </div><div> </div><div> do {</div><div> opcion = menu();</div><div> switch (opcion) {</div><div> case 'A': Inicializar(datos);</div><div> break;</div>
<div> case 'B': Imprimir(datos);</div><div> break;</div><div> case 'C': Destruir(datos);</div><div> break; </div><div>
case 'D': cout << "Introduzca una ciudad: " ;</div><div> cin >> ciudad;</div><div> AlmacenarCiudad(datos,ciudad,ok);</div><div>
break;</div><div> case 'E': cout<<"Introduzca el nombre de la ciudad: ";</div><div> cin>>ciudad;</div><div> cout<<"Introduzca el nombre de la persona: ";</div>
<div> cin>>persona;</div><div> AlmacenarPersona(datos,ciudad,persona,ok);</div><div> break;</div><div> case 'F': cout << "Introduzca el nombre de la ciudad: ";</div>
<div> cin >> ciudad;</div><div> cout<<"Introduzca el nombre de la persona: ";</div><div> cin>>persona;</div><div> // T_persona encontrada;</div>
<div> BuscarPersona(datos,ciudad,persona);</div><div> // if (encontrada!=NULL){</div><div> // cout<<encontrada->nombre<<" esta en la lista"<<endl; </div>
<div> // }</div><div> break;</div><div> }</div><div> }while (opcion != 'X');</div><div><br></div><div>system ("PAUSE");</div><div>return 0;</div>
<div>}</div></div><div><br></div><div><br></div><div><br></div><div>Muchas gracias y un saludo.</div>