[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