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.

Necesito ayuda para imprimir una lista enlazada de asignación dinámica en C.

typedef struct Word {
char** translations;
struct Word* next;
} Word;

typedef struct {
char** languages;
int numOfLanguages;
Word* wordList;
} Dictionary;

void printWordList(Word* wordlist, int numOfLanguages)
{
Word* currentWord = wordlist;
int i = 0;
while (currentWord != NULL)
{
for (i=0; i < numOfLanguages; i++)
{
printf(“%s”, currentWord->translations[i]);
if (i < numOfLanguages – 1)
putchar(‘,’);
}
putchar(‘\n’);
currentWord = currentWord->next;
}
putchar(‘\n’);
}

Hola, tengo un programa que es un diccionario de asignación dinámica que funciona de la siguiente manera:

Elige un diccionario:
1. Inglés,Español,Francés
2. Inglés,Hebreo
3. Español,Inglés

1

Ingresa una palabra en Inglés,Español,Francés:

Thank_you,Gracias,Merci

¡La palabra se ha agregado con éxito!

Más tarde uso la función de arriba, printWordList, para intentar imprimir todas las palabras (y sus traducciones, Thank_you,Gracias,Merci cuenta como una palabra, siendo Gracias y Mercy los elementos del arreglo de traducciones)

La función funciona perfectamente cuando solo hay una palabra y traducciones, pero si agrego otra palabra a la lista, entra en un bucle infinito y aún solo imprime la primera palabra.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Explicación del problema

    El problema parece estar relacionado con el recorrido de la lista enlazada dentro de la función printWordList(). La condición del bucle verifica que currentWord != NULL, pero no considera el caso en el que la lista enlazada contiene más de una palabra. En otras palabras, el bucle sigue ejecutándose aunque todas las palabras hayan sido impresas.

    Solución

    Para solucionar el problema, podemos añadir una condición adicional al bucle while que compruebe si la palabra actual es la última palabra de la lista. Si lo es, salimos del bucle. A continuación se muestra una posible implementación de la función printWordList() modificada:

    void printWordList(Word* wordlist, int numOfLanguages)
    {
        Word* currentWord = wordlist;
        while (currentWord != NULL)
        {
            for (int i=0; i < numOfLanguages; i++)
            {
                printf("%s", currentWord->translations[i]);
                if (i < numOfLanguages - 1)
                    putchar(',');
            }
            putchar('\n');
            if (currentWord->next == NULL) // comprobar si esta es la última palabra
                break; // salir del bucle
            currentWord = currentWord->next;
        }
        putchar('\n');
    }
    

    La implementación anterior utiliza el puntero currentWord->next para comprobar si la palabra actual es la última palabra de la lista. Si lo es, salimos del bucle. De lo contrario, actualizamos currentWord para que apunte a la siguiente palabra de la lista y continuamos con el bucle.

    Al añadir la condición adicional, nos aseguramos de que el bucle se detenga cuando todas las palabras hayan sido impresas, independientemente del tamaño de la lista enlazada.

Comments are closed.