Bonjour
J'ai dans un livre un exemple de listes chainées, dont je reproduis la classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Node{ public: int data; Node *next; Node(int, Node*); //déclarations de fonction.. };
J'ai voulu optimisé les fonctions push et pull.
La fonction push ajoute un objet à la suite des autres.
J'ai transformé:
en:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void Node::push(Node** mapile,int valeur){ Node* element=new Node(valeur,*mapile); *mapile=element; }
>>La seule grosse différence est que dans le deuxième cas, je fait passer un pointeur sur une référence. Plus exactement, je fais passer la référence du pointeur sur mapile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void Node::push(Node* &mapile,int valeur){ mapile=new Node(valeur,mapile); }
Mais j'ai quand même du mal à comprendre la différence entre Node* mapile et Node* &mapile.
La fonction pull est censée rajouter un objet en début de liste.
j'ai aussi transformé ce code :
en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void Node::pull(Node *ppile,int val){ do{ppile=ppile->next;}while(ppile->next); ppile->data=val; ppile->next=new Node(0,0); }
En effet, je préfère ce code au premier. Dans les deux cas, on crée en effet qu'un seul nouvel objet. Mais ce que cache le premier, c'est que le pointeur qui est en bout de liste, qui vaut 0, existe deja. Donc quand on fait: new Node(0,0), on crée une nouvelle fin de liste, alors qu'elle existe déjà. Dans le deuxième cas, on la conserve.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void Node::pull(Node *ppile,int val){ do{ppile=ppile->next;}while(ppile->next->next); ppile->next=new Node(val,ppile->next); }
On reconnecte simplement la fin de liste au nouvel objet.
que pensez vous de mes modifs?
Merci
Partager