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.

Agregando una lista enlazada a otra lista en programación en C.

Soy un traductor de español que traduce documentos de IT. Traduzco lo siguiente al español. No traduzcas el código y la salida en markdown

Soy un principiante que intenta agregar una lista enlazada a otra lista enlazada usando c. El problema es que el programa está entrando en un bucle infinito y no sé por qué.
Aquí está el siguiente código c

typedef struct bookInfo
{
    int code;
    struct bookInfo *next;
} bookInfo;

typedef struct subscriber
{
    int code;
    struct bookInfo *books;
    struct subscriber *next;
    struct subscriber *prec;
} subscriber;

typedef bookInfo *Book;
typedef subscriber *Subscriber;
typedef Subscriber *SubscriberList;

void newBook(Book *bk, int val)
{
    bookInfo *new_node = malloc(sizeof(bookInfo));
    bookInfo *last = *bk;
    new_node->code = val;
    new_node->next = NULL;

    if (*bk == NULL)
    {
        *bk = new_node;
    }
    else
    {
        while (last->next != NULL)
            last = last->next;
        last->next = new_node;
    }
}

Subscriber Add_book(Subscriber S, Book Bk)
{
    bookInfo *newNode = malloc(sizeof(bookInfo));
    bookInfo *tmp;
    newNode->next = NULL;
    newNode->code = Bk->code;
    if (S == NULL)
        printf("\nel suscriptor es nulo");
    else
    {
        if (S->books == NULL)
            S->books = newNode;    
        else
        {
            tmp = S->books;
            while (tmp != NULL)
                tmp = tmp->next;
            tmp->next = newNode;
            printf("\nla adición del libro se ha realizado");
        };
    }
    return S;
};

Espero que puedan ayudarme y gracias. No sé si el problema está en la función newBook o qué y aquí está mi función principal

int main()
{
    book_ref, sub_ref = NULL;
    newSubscriber(&sub_ref);
    bookInfo b1 = {20,NULL};
    Add_book(sub_ref, &b1);
    printf("\n%d : %d", sub_ref->code, sub_ref->books->code);
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código parece estar en la función Add_book donde el bucle while no actualiza el puntero tmp para moverse al siguiente libro de la lista, creando así un bucle infinito.

    Para solucionar este problema, el código debería actualizar el puntero tmp para apuntar al siguiente libro de la lista añadiendo “tmp = tmp->next;” dentro del bucle while.

    La función Add_book corregida se vería así:

    Subscriber Add_book(Subscriber S, Book Bk)
    {
        bookInfo *newNode = malloc(sizeof(bookInfo));
        bookInfo *tmp;
        newNode->next = NULL;
        newNode->code = Bk->code;
        if (S == NULL)
            printf("\nl'abonnee est nulle");
        else
        {
            if (S->books == NULL)
                S->books = newNode;    
            else
            {
                tmp = S->books;
                while (tmp != NULL)
                {
                    tmp = tmp->next;
                }
                tmp->next = newNode;
                printf("\nl'ajout du livre a ete effectue");
            };
        }
        return S;
    }
    

    Además, en la función principal, hay un error de sintaxis en la declaración de las variables book_ref y sub_ref. La declaración corregida sería:

    Book book_ref = NULL;
    Subscriber sub_ref = NULL;
    

    Con estos cambios, el programa debería poder añadir un nuevo libro a la lista de libros de un abonado sin entrar en un bucle infinito.

Comments are closed.