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