[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