[C con Clase] lista ciudad-personas

Steven Davidson srd4121 en njit.edu
Sab Abr 10 22:23:34 CEST 2010


Hola Toni,

Toni wrote:
> 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".
> 

Esto ocurre porque realizas el bucle 'while' tanto si la lista 'datos' 
estaba originalmente vacía o no. Date cuenta que la primera sentencia 
'if' trata el caso particular de una lista vacía. Su consecuencia es que 
agregas el nodo a 'datos' y por tanto, no necesitas hacer nada más. 
Deberías terminar de inmediato. El esquema del programa sería:

// Caso particular: lista vacía => 0 nodos
if( !datos )
{
   ...
}
else  // Caso general: lista existente => > 0 nodos
{
   ...
}

if( ok ) { ... }
else { ... }


De hecho, no necesitas usar 'aux' en el caso particular de una lista vacía.

> 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.
> 

En primer lugar, si la lista está vacía, no sabemos el valor de 'ok'. 
Deberías asginar un valor inicial a 'ok'. Por ejemplo,

ok = false;

if( !datos )
{
   ...
}

if( ok )  ...
else  ...

En segundo lugar, al terminar el bucle 'while', inmediatamente accedes 
al miembro 'ciutat' apuntado por 'aux'. Sin embargo, no tienes en cuenta 
la posibilidad de que 'aux' sea nulo. Si se da este caso, entonces el 
acceso es denegado y lógicamente el sistema operativo te dará un error.

Tienes que comprobar que 'aux' es un puntero válido antes de intentar 
usarlo. Por ejemplo,

while( ... )  {...}

if( aux )  // Si 'aux' es válido, entonces 'aux->ciutat == ciudad'
{
   ok = true;
   ...
}

Por último, no veo que sea necesario usar 'aux2' en el caso de que la 
ciudad no contenga ninguna persona. Como 'aux->per' es nulo, el primer 
nodo que creamos va a ser el único nodo que va a tener a estas alturas.


Espero que todo esto te sea de ayuda.

Steven





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