Dev - C++ - Insertar en lista enlazada ordenadamente

 
Vista:
Imágen de perfil de Urban_WildCat

Insertar en lista enlazada ordenadamente

Publicado por Urban_WildCat (2 intervenciones) el 11/11/2017 23:35:04
Hola!

Veréis, llevo 3 horas comiéndome la cabeza con este código y no consigo sacarlo. Tengo una clase cliente, con un atributo llamado ID que es una string de 4 letras. (ej. "ABCD"). Tengo una lista con varios de estos clientes, con Id's generadas aleatoriamente, pero previamente ordenada (de "AAAA", primero, a "ZZZZ", último). Deseo introducir un cliente con una Id que debería ir entre medias de esta lista ordenada. Lo realizo de la siguiente forma:

Tengo la siguiente lista:
Dni: 56495745V - Hora de inicio de compra: 5 - Hora de fin de compra: 8 - ID: AAAA
Dni: 88257733V - Hora de inicio de compra: 5 - Hora de fin de compra: 9 - ID: BBBB
Dni: 85221964H - Hora de inicio de compra: 5 - Hora de fin de compra: 14 - ID: CCCC
Dni: 91761636P - Hora de inicio de compra: 5 - Hora de fin de compra: 6 - ID: DDDD
Dni: 75636147A - Hora de inicio de compra: 5 - Hora de fin de compra: 12 - ID: FFFF
Dni: 14987955M - Hora de inicio de compra: 5 - Hora de fin de compra: 9 - ID: GGGG
Dni: 43985567E - Hora de inicio de compra: 5 - Hora de fin de compra: 15 - ID: HHHH
Dni: 61269954R - Hora de inicio de compra: 5 - Hora de fin de compra: 12 - ID: IIII

Quiero insertar el siguiente elemento cliente:
Dni: 48879625W - Hora de inicio de compra: 5 - Hora de fin de compra: 9 - ID: EEEE

Para no aumentar la complejidad de la duda, en lugar de utilizar un bucle fuero a que el puntero aux. apunte a la posición 4 (Id: "DDDD"). Entonces ejecuto este código:
1
2
3
4
5
6
7
8
9
10
11
pnodocolacliente aux; // Puntero a NodoColaCliente.
NodoColaCliente nodoCliente = NodoColaCliente(cliente); // NodoColaCliente con el cliente que quiero insertar, con ID="EEEE"
aux = primero; // Posición 1 (Id: "AAAA")
aux = aux->siguiente; // Posición 2 (Id: "BBBB")
aux = aux->siguiente; // Posición 3 (Id: "CCCC")
aux = aux->siguiente; // Posición 4 (Id: "DDDD")
cout << "Aux: " + aux->cliente.mostrarDatos() << endl; // Devuelve el cliente "DDDD".
cout << "Aux.siguiente: " + aux->siguiente->cliente.mostrarDatos() << endl; // Devuelve el cliente "FFFF"
nodoCliente.siguiente = aux->siguiente; // Hago que apunte al cliente con Id. "FFFF"
aux->siguiente=&nodoCliente; // Quiero hacer que el puntero del nodo con el cliente "DDDD" apunte a nodoCliente,
//que contiene el cliente con Id "EEEE". Sin embargo, al ejecutar esta línea, el programa se cierra.

Al ejecutar la última línea el programa crashea. Si la tengo comentada se ejecuta correctamente, claro que entonces no termino de insertar el elemento. ¿Qué estoy haciendo mal?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 84
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Insertar en lista enlazada ordenadamente

Publicado por Yamil (41 intervenciones) el 11/11/2017 23:46:28
nodoCliente deberia ser del tipo pnodocolacliente.
Los apuntadores son creados en un area especial de memoria llamada el heap, mientras que las variables locales son creadas en un area de memoria llamada stack, por eso cuando sales de la funcion estas desapareces al menos que guardes una refrencia a ellas en otra variable de mayor ambito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Urban_WildCat

Insertar en lista enlazada ordenadamente

Publicado por Urban_WildCat (2 intervenciones) el 11/11/2017 23:57:19
También lo he estado intentando así antes, pero me crashea esta vez en ambas líneas:

1
2
3
4
5
6
7
8
9
10
11
pnodocolacliente aux;
pnodocolacliente nodoCliente;
nodoCliente->cliente=cliente;
aux = primero;
aux = aux->siguiente;
aux = aux->siguiente;
aux = aux->siguiente;
cout << "Aux: " + aux->cliente.mostrarDatos() << endl;
cout << "Aux.siguiente: " + aux->siguiente->cliente.mostrarDatos() << endl;
nodoCliente->siguiente = aux->siguiente; // Crashea
aux->siguiente = nodoCliente;// Crashea

No sé si es que ya no son horas para ponerse con esto, qué problema hay. A ver si me puedes ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 84
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Insertar en lista enlazada ordenadamente

Publicado por Yamil (41 intervenciones) el 12/11/2017 00:16:38
Pero debes inicializar nodoCliente...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar