[C con Clase] 1 lista dentro de otra lista

Toni tsptoni en gmail.com
Sab Abr 10 12:53:33 CEST 2010


Muchas gracias David, consegui solucionarlo gracias a tu ayuda, lo que hice
fue primero tratar el caso particular de que el primero sea nulo, y ya luego
el resto del bucle tuve en cuenta lo que me dijiste, que mi puntero debia
apuntar antes del nulo, sino es demasiado tarde. Así me quedo:


void AlmacenarCiudad (T_ciudad& datos, const string& ciudad, bool& ok){

        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;
     }
 }



El 10 de abril de 2010 04:22, Steven Davidson <srd4121 en njit.edu> escribió:

> Hola Toni,
>
>
> Toni wrote:
>
>> hola, estoy aprendiendo a usar C++ y estoy atascado en una práctica.
>>
>> Después de estar ya un par de horas buscando por donde falla mi
>> código, ya lo localicé, y al parecer el void AlmacenarCiudad no
>> funciona correctamente, ya que no escribe en el nodo el nombre de la
>> ciudad, lo deja en nulo como podeis ver a continuacion.
>>
>>
> [CORTE]
>
>
>>
> Veamos solamente la función en cuestión.
>
>
>  void AlmacenarCiudad (T_ciudad& datos, const string& ciudad, bool& ok){
>>                T_ciudad aux;
>>        ok=false;
>>        aux=datos;       /*      if (datos==NULL){
>>        datos=new nodo1;
>>        datos->ciutat=ciudad;
>>        datos->sig=NULL;
>>        aux=datos;
>>        }*/
>>        while (aux!=NULL){   //no consigo que escriba el nombre de la
>> ciudad...
>>           if (aux->sig->ciutat==ciudad){
>>
>
> No sabes si 'aux->sig' es un puntero válido. Por lo que veo, deberías
> comprobar 'aux->ciutat' y no la información del siguiente nodo.
>
> En segundo lugar, si ya hemos encontrado que la ciudad existe, entonces
> deberíamos terminar este bucle 'while' para no continuar. De esta manera,
> 'aux' apunta al nodo correcto. De lo contrario, 'aux' acabará siendo nulo,
> porque la lista está diseñada así: un puntero nulo al final.
>
>
>               ok=true;                                   }
>>           aux=aux->sig;           }
>>          if (aux==NULL){
>>              aux = new nodo1;
>> aux->ciutat=ciudad;
>>              aux->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;       }
>>  }
>>
>>
>
> Si la ciudad no existe, creas un nuevo nodo, pero no enlazas ese nodo a la
> lista actual apuntada por 'datos'. Debes relacionar el nuevo nodo con los
> demás en la lista.
>
> En tu caso, debes guardar el puntero al último nodo, para poder modificar
> su puntero 'sig'. Tal y como implementas esta función, 'aux' llega a ser
> nulo, lo cual no ayuda si quieres modificar la lista original; es demasiado
> tarde.
>
> Sugiero que mantengas otro puntero al nodo anterior a 'aux'. Por ejemplo,
>
> ant = datos;
> aux = ant->sig;
>
> while( !aux && !ok )
> {
>  if( aux->ciutat == ciudad )
>    ok = true;
>
>  ant = aux;
>  aux = ant->sig;
> }
>
> if( !aux )
> {
>  // Reusamos 'aux'
>
>  aux = new nodo1;
>  aux->ciutat = ciudad;
>  aux->sig = 0;
> }
>
> ant->sig = aux;  // Enlazamos el nuevo nodo a la lista
>
> Este algoritmo sólo funciona si la lista tiene más de 2 nodos. Deberías
> tratar los casos particulares de una lista vacía o de un solo nodo.
>
>
> Espero que esto te oriente.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100410/8ed67798/attachment.html>


Más información sobre la lista de distribución Cconclase