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>