[C con Clase] lista ciudad-personas
Toni
tsptoni en gmail.com
Dom Abr 11 01:13:17 CEST 2010
Muchas gracias David, al final de mucho pensar mas tu ayuda logre que
funcione perfectamente:
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.
// (SOLUCIONADO)
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 a true.
aux=datos;
if (datos!=NULL){
while ((aux->sig!=NULL) && (aux->ciutat!=ciudad)){
aux=aux->sig;
}
if (aux->ciutat==ciudad){
ok=true; //la ciudad ya existe
}
if (aux->ciutat!=ciudad){
aux->sig = new nodo1;
aux->sig->ciutat=ciudad;
aux->sig->sig=NULL;
}
}
else{
datos=new nodo1;
datos->ciutat=ciudad;
datos->sig=NULL;
aux=datos;
}
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");
}
y el otro quedo asi:
void AlmacenarPersona (T_ciudad& datos, const string& ciudad, const string&
persona, bool& ok){
if (datos!=NULL){
T_ciudad aux;
T_persona aux2;
aux=datos;
ok=false;
while ((aux->sig!=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...
// (SOLUCIONADO)
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");
}
Muchas gracias!
El 10 de abril de 2010 22:23, Steven Davidson <srd4121 en njit.edu> escribió:
> 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
>
>
> _______________________________________________
> 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/20100411/e6b8cdfb/attachment.html>
Más información sobre la lista de distribución Cconclase