[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