[C con Clase] 1 lista dentro de otra lista

Steven Davidson srd4121 en njit.edu
Sab Abr 10 04:22:09 CEST 2010


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





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