2017-09-05 4 views
-2

ici est le code de langue c:Quelqu'un peut-il me dire pourquoi cette fonction n'ajoute pas de nœud pour durer et comment puis-je le résoudre?

struct node 
{ 
    int num; 
    struct node* next; 
}; 

void add_last(struct node* head,struct node* new_node) 
{ 
    new_node->next=head; 
    head=new_node; 
} 

Je ne besoin de code, je veux seulement comprendre pourquoi cela ne fonctionne pas merci à l'avance.

+0

Cela ne fonctionne pas parce que vous ne l'appelez pas. –

+0

_Questions cherchant l'aide de débogage (pourquoi ce code ne fonctionne-t-il pas?) Doivent inclure le comportement désiré, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve] ._ –

+0

Il est difficile d'offrir des solutions lorsque l'énoncé du problème est simplement «ça ne marche pas».S'il vous plaît [modifier] votre question pour donner une description plus complète de ce que vous attendiez et comment cela diffère des résultats réels. Voir [demander] pour des conseils sur ce qui fait une bonne explication. –

Répondre

1

Parce que C est appelé par valeur. Vous ne pouvez pas modifier la valeur d'un argument (par exemple, head) dans une fonction et attendre que l'appelant le remarque.

Cela devrait vraiment être une dupe, mais je n'ai pas réussi à le trouver.

Il y a deux façons de le fixer:

  • la nouvelle valeur de retour, ou
  • passer un pointeur sur la valeur, de sorte que la fonction peut modifier.

La première est généralement plus propre, si possible.

Cela rendrait:

struct node * add_last(struct node *head, struct node *new_node) 
{ 
    new_node->next = head; 
    return new_node; 
} 
+0

alors comment puis-je résoudre ce cas –

+0

et simplement faire 'head = add_last (head, new_node)' où nécessaire. –

0

Puisque C est un langage « passe par la valeur », la déclaration head = ...; ne prend effet dans le corps de la fonction. Si vous voulez modifier le pointeur de la tête, vous devez le déréffer et lui affecter.

1

En paramètres linguistiques sont passé par valeur, les modifications effectuées en fonction de cette copie du pointeur ne prend effet que dans le corps de la fonction, après cette copie modifiée du pointeur est retiré du champ et perdu.

Si vous voulez passer un « référence » ( ne marche pas support des références réelles comme ) et de modifier ce pointeur, vous devez passer un pointeur à pointeur que vous souhaitez modifier, comme

struct node * add_last(struct node **head, struct node *new_node) 
//         ^^ 
{ 
    new_node->next = head; 
    head=new_node; 
} 

// Calling 
add_last(&head, new_node); 

occasion la deuxième est de retourner ce pointeur

struct node * add_last(struct node *head, struct node *new_node) 
{ 
    new_node->next = head; 
    return new_node; 
} 

// Calling 
head = add_last(head,new_node); 
0

Essayez de répondre à la question suivante:

Compte tenu de ces extraits du programme:

int foo(int a) 
{ 
    a = 1234; 
} 

... 
int bar = 1; 
foo(bar); 
// what's the value of bar here 

Quelle est la valeur de bar juste après l'appel à foo?

1 ou 1234?