es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una función para insertar un nuevo nodo en su posición correcta en una lista enlazada simple y ordenada de fechas

Así que tengo una lista enlazada simple ordenada y tengo que agregar un nuevo nodo en la posición correcta.

Aquí están mis estructuras:

“`c++
typedef struct date
{
int dd;
int mm;
int yy;
} date;

typedef struct node
{
date d;
node* next;
} node;

<pre><code><br />Y aquí está la función que hice:

“`c++
node* addNode(date pn, node* head)
{
node* pnew = (node*)malloc(sizeof(node));
pnew->d = pn;
pnew->next = NULL;

for (node* i = head; i != NULL; i = i->next)
{
if (i->d.yy > pnew->d.yy)
{
if (i->d.mm != pnew->d.mm || i->d.dd != pnew->d.dd)
continue;
else
{
pnew->next = i->next;
i->next = pnew;
break;
}
}
else if (i->d.yy == pnew->d.yy && i->d.mm > pnew->d.mm)
{
if (i->d.dd != pnew->d.dd)
continue;
else
{
pnew->next = i->next;
i->next = pnew;
break;
}
}
else if (i->d.yy == pnew->d.yy && i->d.mm == pnew->d.mm && i->d.dd > pnew->d.dd)
{
pnew->next = i->next;
i->next = pnew;
break;
}
else if (i->d.yy == pnew->d.yy && i->d.mm == pnew->d.mm && i->d.dd == pnew->d.dd)
{
pnew->next = i->next;
i->next = pnew;
break;
}
}

return head;
}

En realidad, verifiqué si esta parte de código funciona pnew->next = i->next; i->next = pnew; Y funciona bien, así que el problema está relacionado con las declaraciones if. Pero no puedo encontrar un error.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El código que proporcionaste parece correcto, pero hay algunos casos especiales que debes considerar:

    • ¿Qué ocurre si la lista está vacía? Debes agregar el nuevo nodo como la cabeza de la lista.
    • ¿Qué ocurre si el nuevo nodo tiene una fecha menor que todas las fechas de la lista? Debes agregar el nuevo nodo como la cabeza de la lista.
    • ¿Qué ocurre si el nuevo nodo tiene una fecha mayor que todas las fechas de la lista? Debes agregar el nuevo nodo al final de la lista.

    Suponiendo que has considerado estos casos especiales, el código debería funcionar correctamente. Sin embargo, hay un pequeño error en tu código. En lugar de “->”, deberías usar “.” para acceder a los campos de la estructura. Aquí está el código corregido:

    node* addNode(date pn, node* head)
    {
        node* pnew = (node*)malloc(sizeof(node));
        pnew->d = pn;
        pnew->next = NULL;
    
        if (head == NULL || pnew->d.yy < head->d.yy || 
            (pnew->d.yy == head->d.yy && pnew->d.mm < head->d.mm) ||
            (pnew->d.yy == head->d.yy && pnew->d.mm == head->d.mm && pnew->d.dd <= head->d.dd))
        {
            pnew->next = head;
            return pnew;
        }
    
        node* curr = head;
        while (curr->next != NULL && (curr->next->d.yy < pnew->d.yy ||
               (curr->next->d.yy == pnew->d.yy && curr->next->d.mm < pnew->d.mm) ||
               (curr->next->d.yy == pnew->d.yy && curr->next->d.mm == pnew->d.mm && curr->next->d.dd < pnew->d.dd)))
        {
            curr = curr->next;
        }
    
        pnew->next = curr->next;
        curr->next = pnew;
        return head;
    }
    

    En este código, verificamos si el nuevo nodo debe ser agregado al principio de la lista. Si no es así, recorremos la lista utilizando un bucle while y agregamos el nuevo nodo en la posición correcta.

Comments are closed.