Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BrendiisFox en 14 Septiembre 2015, 22:40 pm



Título: Insertar enmedio de una lista doblemente enlazada
Publicado por: BrendiisFox en 14 Septiembre 2015, 22:40 pm
Buenas Tardes!
Estoy trabajando con C++, listas doblemente enlazada. Nos pidieron ingresar al incicio, enmedio y al final, de los cuales ya logre realizar el insertar al inicio y al final. Mi problema es, ¿Como inserto en medio?
Me dijeron que es necesario un contador el cual no implemente y no se que tan cierto sera.

Le comparto algo del codigo que ya tengo realizado:


De antemano muchas gracias


Título: Re: Insertar enmedio de una lista doblemente enlazada
Publicado por: ivancea96 en 15 Septiembre 2015, 14:47 pm
Imagina una lista de 10 elementos. Si te piden insertar un valor para que quede de elemento 3, lo que harías es:
- Empezar desde el nodo de inicio.
- Avanzar al siguiente hasta llegar al elemento anterior al actual 3.
- Creas el nuevo nodo, y lo enlazas: el SIGUIENTE del nodo 2, lo igualas a la dirección del nodo nuevo. El ANTERIOR del antiguo nodo 3, lo enlazas a la dirección del nuevo nodo. El anterior y el siguiente del nodo nuevo, los enlazas con el segundo y el tercero, respectivamente.

Con esto, tienes q tener cuidado de una cosa, y es que la posicion no sea mayor al numero de nodos+1 que tienes.

Puedes optimizarlo llamando a InserteAlInicio cuando el parametro de Insertar sea 0, y llamando a InserteAlFinal cuando sea igual al número de nodos. Esto ya como una posibilidad.


Y una cosa que te recomiendo encarecidamente: guarda en ListaDobleEnlazada el número de nodos que tiene. Una variable que incrementes al insertar, y que decrementes al quitar. Así te libras de problemas, además de que es un dato esencial.


Título: Re: Insertar enmedio de una lista doblemente enlazada
Publicado por: BrendiisFox en 16 Septiembre 2015, 18:40 pm
Muchas Gracias!
Am, estuve intentando y si, tuve que crear una variable de tamaño la cual incrementa cuando inserto y disminuye cuando elimino. Logre que inserte en medio, pero solo cuando ingreso tres numeros. Si agrego mas, cuando intento ingresar en medio lo coloco detras del primero.

Código
  1. void InserteAlMedio(string elemento){
  2. Nodo *temporal = new Nodo(elemento);
  3. if(Vacio() == true){
  4. primero=ultimo=temporal;
  5. }
  6. else{
  7. /*temporal->siguiente = primero;
  8. primero->anterior = ultimo;
  9. temporal->anterior = primero;
  10. //primero->anterior = temporal->siguiente;
  11. primero->anterior = temporal; */
  12.  
  13.  
  14. /*primero->anterior = ultimo;
  15. ultimo->anterior = temporal;
  16. temporal->siguiente = temporal->anterior;  */
  17.  
  18.  
  19. /*primero->siguiente->anterior = temporal;
  20. temporal->siguiente = primero->anterior;
  21. temporal->anterior = primero;
  22. primero->siguiente = temporal; */
  23.  
  24. primero->siguiente-> anterior = temporal;
  25. temporal->siguiente = primero->siguiente;
  26. temporal->anterior = primero;
  27. primero->siguiente = temporal;
  28.  
  29. tamano++;
  30. }
  31. }
  32.  
  33.  
  34.  
  35. void EliminarAlMedio(){
  36. if(Vacio() ==  true){
  37. cout<<"Lista vacia, no puede eliminar."<<endl;
  38. }
  39. else{
  40. //if(primero == ultimo)
  41.  
  42. if (tamano == 0){
  43. Nodo *temporal = primero->siguiente;
  44. delete primero;
  45. primero = temporal;
  46. primero->anterior = NULL;
  47.  
  48. //primero = ultimo = NULL;
  49. //Cuando se tiene mas de un nuedo, este se marca con una variable temporal.
  50. }
  51. else{
  52. Nodo *temporal = primero;
  53. for(int i=0; i<tamano; i++){
  54. primero->siguiente->anterior = primero->anterior;
  55. primero->anterior->siguiente = primero->siguiente;
  56.  
  57. delete temporal;
  58. //Elimina
  59. cout<<"Dato eliminado"<<endl;
  60.  
  61. tamano--;
  62.  
  63.  
  64. /*}
  65. primero->siguiente->anterior = primero->anterior;
  66. primero->anterior->siguiente = primero->siguiente;
  67.  
  68. delete temporal;
  69. //Elimina
  70. cout<<"Dato eliminado"<<endl;
  71.  
  72. tamano--; */
  73. }
  74.  
  75. }
  76. }
  77. }
  78.  


Título: Re: Insertar enmedio de una lista doblemente enlazada
Publicado por: ivancea96 en 16 Septiembre 2015, 21:05 pm
Código
  1. primero->siguiente-> anterior = temporal;
  2. temporal->siguiente = primero->siguiente;
  3. temporal->anterior = primero;
  4. primero->siguiente = temporal;

Tienes que recorrer nodo a nodo, hasta posicionarte detrás de la posición del nuevo nodo que meterás.

Necesitas usar bucle, ya sea WHILE o FOR. Si es necesario, plantéatelo en papel. Ahora tengo algo de prisa xd