2017-10-16 12 views
-2

Il n'y a pas d'erreur mais je m'attendais à 10 valeurs mais j'en ai eu seulement une. Le ci-dessous est ma fonction de création et d'affichage.N'affichera pas plus d'une valeur

void create() 
{ 
int random; 
for (int i = 0; i < 10; i++) 
{ 
    struct node *new_node, *current; 
    new_node = new node; 
    random = randomNum(); 
    new_node->data = random; 
    new_node->next = NULL; 
    if (start == NULL) 
    { 
     start = new_node; 
     current = new_node; 
     new_node = NULL; 
    } 
    else 
    { 
     current->next = new_node; 
     current = new_node; 
    } 
} 
} 

void display() 
{ 
struct node *new_node; 
new_node = start; 
while (new_node != NULL) 
{ 
    cout << new_node->data << "->"; 
    new_node = new_node->next; 
} 
} 

De quoi ai-je besoin pour changer?

+2

Si le démarrage est NULL, où ne courant initialisées? – Steve

+1

_Je a essayé d'initialiser 'current-> next = NULL'_ Avez-vous lu le message d'avertissement? Il se plaint de' curre nt' (qui n'est pas initialisé), pas 'current-> next'. Et la raison d'un tel avertissement est: si la condition dans 'if (start == NULL)' est fausse - le bloc 'else' est exécuté, et' current-> next = new_node; 'est UB en raison d'une déréférence du pointeur non initialisé (votre tentative de correction de 'current-> next = NULL' est UB pour la même raison). –

+0

@Wing Hang Khoo Est-ce une erreur ou un avertissement? Si c'est un avertissement, vous pouvez l'ignorer. –

Répondre

0

Essayez la ligne suivante

current = new_node;  
current->next = new_node; 

Parce que dans votre cas, il n'y a pas de valeur de pointeur current alors comment pouvez-vous mettre à jour sa prochaine. Tout d'abord mettre à jour/régler le courant puis mettre à jour/définir le suivant.

if (start == NULL) 
    { 
     start = new_node; 
     current = new_node; 
     current->next = NULL; 
     new_node = NULL; 
    } 
    else 
    { 
     current = new_node; 
     current->next = new_node; 

    } 
+0

Il n'y a pas d'erreur maintenant, mais ma sortie n'est pas affiché correctement. De quoi ai-je besoin pour changer? –

0

Le problème avec le message du compilateur est que le compilateur ne peut pas déterminer si la current variable utilisée dans l'instruction else était au début initialisés.

S'il s'agit d'un avertissement, vous pouvez l'ignorer.

Ou vous pouvez réécrire la fonction de la manière suivante

void create() 
{ 
    const int N = 10; 

    node **current = &start; 

    while (*current) current = &(*current)->next; 

    for (int i = 0; i < N; i++) 
    { 
     *current = new node; 
     (*current)->data = randomNum(); 
     (*current)->next = nullptr; 
     current = &(*current)->next; 
    } 
} 

Le corps de la boucle peut aussi être écrit comme (je suppose que le membre de données data précède le membre de données next dans la définition du nœud. Dans le cas contraire échanger les initialiseurs.

*current = new node { randomNum(), nullptr }; 
current = &(*current)->next;