elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Insertar enmedio de una lista doblemente enlazada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Insertar enmedio de una lista doblemente enlazada  (Leído 3,468 veces)
BrendiisFox

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Insertar enmedio de una lista doblemente enlazada
« 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


« Última modificación: 27 Septiembre 2015, 03:58 am por BrendiisFox » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Insertar enmedio de una lista doblemente enlazada
« Respuesta #1 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.


En línea

BrendiisFox

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Insertar enmedio de una lista doblemente enlazada
« Respuesta #2 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.  
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Insertar enmedio de una lista doblemente enlazada
« Respuesta #3 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una lista circular doblemente enlazada en c sharp c#
.NET (C#, VB.NET, ASP)
neo_angel_xxx 2 9,011 Último mensaje 29 Octubre 2010, 01:48 am
por [D4N93R]
ayuda...Lista doblemente enlazada
Java
goll9d 2 3,631 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
ayuda con lista doblemente enlazada
Programación C/C++
gibi77 3 3,694 Último mensaje 7 Marzo 2012, 07:47 am
por nirvguy
Ayuda con lista doblemente enlazada
Programación C/C++
falconez 2 9,019 Último mensaje 16 Diciembre 2013, 01:35 am
por falconez
lista doblemente enlazada
Programación C/C++
d91 1 1,928 Último mensaje 19 Octubre 2015, 04:06 am
por d91
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines