Insertar enmedio de una lista doblemente enlazada

Iniciado por BrendiisFox, 14 Septiembre 2015, 22:40 PM

0 Miembros y 1 Visitante están viendo este tema.

BrendiisFox

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

ivancea96

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.

BrendiisFox

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 (cpp) [Seleccionar]

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--; */
}

}
}
}

ivancea96

Código (cpp) [Seleccionar]
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