Autor
|
Tema: Insertar enmedio de una lista doblemente enlazada (Leído 3,468 veces)
|
BrendiisFox
Desconectado
Mensajes: 13
|
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
Mensajes: 3.412
ASMático
|
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
Mensajes: 13
|
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. void InserteAlMedio(string elemento){ Nodo *temporal = new Nodo(elemento); if(Vacio() == true){ primero=ultimo=temporal; } else{ /*temporal->siguiente = primero; primero->anterior = ultimo; temporal->anterior = primero; //primero->anterior = temporal->siguiente; primero->anterior = temporal; */ /*primero->anterior = ultimo; ultimo->anterior = temporal; temporal->siguiente = temporal->anterior; */ /*primero->siguiente->anterior = temporal; temporal->siguiente = primero->anterior; temporal->anterior = primero; primero->siguiente = temporal; */ primero->siguiente-> anterior = temporal; temporal->siguiente = primero->siguiente; temporal->anterior = primero; primero->siguiente = temporal; tamano++; } } void EliminarAlMedio(){ if(Vacio() == true){ cout<<"Lista vacia, no puede eliminar."<<endl; } else{ //if(primero == ultimo) if (tamano == 0){ Nodo *temporal = primero->siguiente; delete primero; primero = temporal; primero->anterior = NULL; //primero = ultimo = NULL; //Cuando se tiene mas de un nuedo, este se marca con una variable temporal. } else{ Nodo *temporal = primero; for(int i=0; i<tamano; i++){ primero->siguiente->anterior = primero->anterior; primero->anterior->siguiente = primero->siguiente; delete temporal; //Elimina cout<<"Dato eliminado"<<endl; tamano--; /*} primero->siguiente->anterior = primero->anterior; primero->anterior->siguiente = primero->siguiente; delete temporal; //Elimina cout<<"Dato eliminado"<<endl; tamano--; */ } } } }
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
primero->siguiente-> anterior = temporal; temporal->siguiente = primero->siguiente; temporal->anterior = primero; 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
|
|
|
|
|
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
|
29 Octubre 2010, 01:48 am
por [D4N93R]
|
|
|
ayuda...Lista doblemente enlazada
Java
|
goll9d
|
2
|
3,631
|
22 Enero 2012, 04:50 am
por goll9d
|
|
|
ayuda con lista doblemente enlazada
Programación C/C++
|
gibi77
|
3
|
3,694
|
7 Marzo 2012, 07:47 am
por nirvguy
|
|
|
Ayuda con lista doblemente enlazada
Programación C/C++
|
falconez
|
2
|
9,019
|
16 Diciembre 2013, 01:35 am
por falconez
|
|
|
lista doblemente enlazada
Programación C/C++
|
d91
|
1
|
1,928
|
19 Octubre 2015, 04:06 am
por d91
|
|