Question sur les listes chainées.
Bonjour
J'ai dans un livre un exemple de listes chainées, dont je reproduis la classe:
Code:
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é:
Code:
1 2 3 4
| void Node::push(Node** mapile,int valeur){
Node* element=new Node(valeur,*mapile);
*mapile=element;
} |
en:
Code:
1 2 3
| void Node::push(Node* &mapile,int valeur){
mapile=new Node(valeur,mapile);
} |
>>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.
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 :
Code:
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 :
Code:
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);
} |
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.
On reconnecte simplement la fin de liste au nouvel objet.
que pensez vous de mes modifs?
Merci