Pointeurs c++

Fermé
pampitup Messages postés 2 Date d'inscription dimanche 4 octobre 2009 Statut Membre Dernière intervention 5 octobre 2009 - 4 oct. 2009 à 23:25
watou Messages postés 199 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 19 avril 2013 - 5 oct. 2009 à 00:48
Bonjour,
novice en la matière, j'ai quelques difficultés à comprendre le fonctionnement des pointeurs en c++, alors que cette notion est bien plus facile en Ada (oui il y a des personnes qui apprennent encore ce langage !)


#include "iostream"
using namespace std ;
struct Node {
string filename ;
Node *next ;
};

void Add1( Node *&flist ) {
for ( Node *p = flist; p != 0; p = p->next ) {
cout << (*p).filename << endl;
}
}
void Add2( Node *&flist ) {
Node node;
node.filename="ananas";
node.next=flist;
flist = &node;
Add1( flist );
}
void Add3( Node *&flist ) {
Node node;
node.filename="pomme";
node.next=flist;
flist = &node;
Add2( flist );
}

int main(){
Node *pnt=0;
Add3( pnt );
//Add1( pnt );
}

Quand j'ajoute Add1 à la fin, je tombe sur une boucle infinie, comme si le dernier pointeur pointait sur lui même. Je n'ai pas le droit d'utiliser "new".
Si quelqu'un pouvait m'expliquer comment je peux ajouter des éléments en début des listes (sans utiliser new), et comment je peux lire ou accéder à ces éléments, ce serait sympa.
Merci

4 réponses

De toute façon pour ajouter un élément dans une liste, il faut allouer de l'espace mémoire.
En conséquence, si on ne veut utiliser le couple new/delete il ne reste plus que la possibilité d'utiliser le couple malloc/free.
Si l'ajout se fait en début de liste, li est bien évident qu'il faut faire une recopie; par contre si l'ajout se fait en fin de liste on peut se contenter d'un realloc.
Bonne continuation.
0
pampitup Messages postés 2 Date d'inscription dimanche 4 octobre 2009 Statut Membre Dernière intervention 5 octobre 2009
5 oct. 2009 à 00:37
merci pr ta réponse rapide,mais je ne veux pas non plus utiliser malloc.
Je ne vois tjs pas la différence entre Add3 qui appelle Add2 et Add1 et qui m'affiche la liste correctement, et juste Add1 qui est censée affichier la liste entière.
Si quelqu'un voit le truc, toutes les remarques sont les bienvenues !
0
Pour ajouter un élément, au début ou à la fin de la liste, il est nécessaire d'agrandir cette liste. Si on ne veut utiliser ni 'new', ni 'malloc' (ou une fonction de ce type), alors il n'y a pas d'autre issue que 'segment fault' !
Bonne réflexion.
0
watou Messages postés 199 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 19 avril 2013 28
5 oct. 2009 à 00:48
ton problème c'est que la variable Node que tu déclares dans les fonctions add2 et add3 sont détruites à la fin d'execution de ces dernières! donc ton pointeur "pnt" pointe un élément détruit (cet espace mémoire n'apprtient plus à ton programme!)
pour ajouter des éléments dans ta liste tu es obligé de faire des allocations mémoire dynamiques.
tu peux utiliser l'opérateur new ou la fonction malloc().(il y en a d'autres...)
syntaxe:
pointeur = new Node ;
pointeur = (* Node)malloc(sizeof(Node));


quelques remarques:
- il vaux mieux utiliser NULL que 0 pour les pointeur.
pointeur = NULL;

- pour transmettre un pointeur à une fonction:
void Add1( Node * flist )
au lieu de
void Add1( Node *&flist )

- il vaux mieux déclarer filename comme etant char[taille_max].
-pour le reste tu te débrouilles pas mal.
0