Lista Doble Dinamica con insercion ordenada?

Iniciado por gibranini, 19 Mayo 2014, 06:31 AM

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

gibranini

Hola buenas noches amigos soy nuevo en el foro y quisiera pedirle su ayuda,
llevo tiempo tratando de hacer una inserción ordenada con listas doblemente ligadas,
alguien sabe como hacerla?
me puede proporcionar un algoritmo o algun codigo, solo me a salido con exito con la simple pero con doble no me sale como quisiera,
solo me enlazada los punteros de" siguiente" y el de "anterior" solo los primeros tres nodos que inserto, alguien que me ayude  :(
D:

por cierto es con Clases (POO)

eferion

Sin ver el código es complicado comentar los errores.... no somos adivinos.

gibranini

jaja aqui esta  :D

void Celular::InsOrdenadoble(string nom, int mod)
{
    Nodo *temp=new Nodo(nom, mod);
    Nodo *temp2=inicio;

    if(Vacia())
    {
        inicio=temp;
        ultimo=temp;

        temp->siguiente=NULL;
        temp->anterior=NULL;
    }
    else
    {
        if(inicio->modelo>mod)//Cuando el nvo Nodo es menor al inicio
        {
            temp->siguiente=inicio;
            inicio->anterior=temp;
            inicio=temp;
        }
        else
        {//Para ser insertardo en otro lugar que no sea inicio
            while(temp2->siguiente!=NULL&&temp2->siguiente->modelo<=mod)
            {
                temp2=temp2->siguiente;
            }

            temp->anterior=temp2;
            temp->siguiente=temp2->siguiente;
            temp2->siguiente=temp->anterior;
            temp2->siguiente=temp;
        }
    }
}

eferion

Veo que estás usando C++.

En este caso, espero que hayas implementado el constructor de la clase Nodo. Si es así, dicho constructor debería inicializar los punteros "siguiente" y "anterior" a NULL, por lo que podrías evitar el uso de determinadas líneas en el código:

Código (cpp) [Seleccionar]

    if(Vacia())
    {
        inicio=temp;
        ultimo=temp;

        // Las siguientes lineas sobrarian
        //temp->siguiente=NULL;
        //temp->anterior=NULL;
    }


Y luego, en el bucle de inserción:

Código (cpp) [Seleccionar]

temp2->siguiente=temp->anterior;
temp2->siguiente=temp;


¿No ves nada raro?

gibranini

tienes razon, tengo un constructor donde inicializo anterior y siguiente y ya corregi lo del
//aux2->siguiente=aux->anterior;
            aux2->siguiente=aux;


pero aun esta igual, sigue sin enlazarle el putero de anterior :(
no me sale, se me "truena" o pasa lo que comentaba al inicio

eferion

Digamos que tú tienes una lista tal que:

A <--> C

y quieres añadir B, que va en medio.

Los pasos a seguir son:

B->ant = A
B->sig = C = A->sig
C->ant = B
A->sig = B

Son 4 pasos... y tu estás haciendo únicamente 3...

Código (cpp) [Seleccionar]

            temp->anterior=temp2;
            temp->siguiente=temp2->siguiente;
            // temp2->siguiente=temp->anterior;
            temp2->siguiente=temp;

gibranini

Gracias eferion ya me salio jaja ;D ;D ;D ;D :laugh: ;-)
tienes mucha razon aparte de que me faltaba declarar un nuevo nodo

esto fue lo que hice

temp->anterior=temp2;
            temp3=temp2->siguiente;
            temp->siguiente=temp2->siguiente;
            temp2->siguiente=temp;
            temp3->anterior=temp;


Saludos :)