Liste chainée : Insertion en tête de liste
Fermé
ENITIEN
-
28 déc. 2009 à 18:07
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 29 déc. 2009 à 20:27
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 29 déc. 2009 à 20:27
A voir également:
- Liste chainée : Insertion en tête de liste
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste groupe whatsapp - Guide
- Liste site streaming illégal - Accueil - Services en ligne
- Liste de diffusion whatsapp - Guide
6 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
28 déc. 2009 à 22:48
28 déc. 2009 à 22:48
petite remarque, utilise typedef pour faire un raccourci pour "struct element", c'est redondant et rend ton code un peu plus dur à lire. De plus, utilise les balises code stp.
Sinon pour ton problème :
dans ton main :
ton "p" c'est "premier" plutôt, c'est ça ?
L'erreur est que tu crois passer ton pointeur "premier" lui-même dans la fonction... mais tu n'en passes qu'une copie!
Il faut passer une référence à la variable "premier" ( "premier&" ) elle-même .
Et de ce fait, le type d'argument que doit recevoir ta fonction sera un pointeur vers un pointer de struct element. Un struct element** . ça devrait régler ton souci si je n'ai pas dit trop de bêtises.
PS : toute mémoire allouée avec malloc devrait être libérée avec free.
Sinon pour ton problème :
dans ton main :
ton "p" c'est "premier" plutôt, c'est ça ?
L'erreur est que tu crois passer ton pointeur "premier" lui-même dans la fonction... mais tu n'en passes qu'une copie!
Il faut passer une référence à la variable "premier" ( "premier&" ) elle-même .
Et de ce fait, le type d'argument que doit recevoir ta fonction sera un pointeur vers un pointer de struct element. Un struct element** . ça devrait régler ton souci si je n'ai pas dit trop de bêtises.
PS : toute mémoire allouée avec malloc devrait être libérée avec free.
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
>
ENITIEN
29 déc. 2009 à 00:19
29 déc. 2009 à 00:19
regarde, c'est comme cet exemple:
Tu peux utiliser la variante 1 ou 2.
Ce qu'il faut bien comprendre, c'est que tu as une variable (un pointeur dans notre cas, mais ça n'a pas d'importance).
Tu veux lui assigner autre chose. Si tu passes cette variable telle quelle en paramètre, c'est une copie qui est fabriquée (comme dans mon exemple faux), la variable de départ dans le main() n'est pas modifiée en fait.
Il faut lui passer le paramètre par référence (avec le & ) comme ans la variante 1, ou alors un pointeur vers cette variable (la variante 2). Quand je te parlait de pointeur vers un pointeur, je pensais à la variante 2. En effet, la variable que tu souhaites modifier, c'est le pointeur. Donc dans ce cas il faudrait avoir un pointeur vers cette variable, comme mon pointeur vers un int.
void modifierEntierFaux(int a, int valeur) { a= valeur; } void modifierEntierJuste1(int& a, int valeur) { a= valeur; } void modifierEntierJuste2(int* a, int valeur) { (*a)=valeur; } int main(void) { int monEntier=0; modifierEntierFaux(monEntier, 5); //ici monEntier vaut toujours 0 en fait modifierEntierJuste1(monEntier, 6); //ici monEntier vaut bien 6; modifierEntierJuste2(&monEntier, 7); //ici monEntier vaut bien 7; }
Tu peux utiliser la variante 1 ou 2.
Ce qu'il faut bien comprendre, c'est que tu as une variable (un pointeur dans notre cas, mais ça n'a pas d'importance).
Tu veux lui assigner autre chose. Si tu passes cette variable telle quelle en paramètre, c'est une copie qui est fabriquée (comme dans mon exemple faux), la variable de départ dans le main() n'est pas modifiée en fait.
Il faut lui passer le paramètre par référence (avec le & ) comme ans la variante 1, ou alors un pointeur vers cette variable (la variante 2). Quand je te parlait de pointeur vers un pointeur, je pensais à la variante 2. En effet, la variable que tu souhaites modifier, c'est le pointeur. Donc dans ce cas il faudrait avoir un pointeur vers cette variable, comme mon pointeur vers un int.
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
28 déc. 2009 à 19:54
28 déc. 2009 à 19:54
Salut,
tu peux t'inspirer de cela....
@+
tu peux t'inspirer de cela....
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct element { int num; struct element* suivant; }Element; void saisie(Element *premier) { Element* p = (Element*)malloc(sizeof(Element)); p->suivant=NULL; printf("donner un entier"); scanf("%d",&p->num); premier->suivant=p; } Element* insertHead(Element* l,int val) { Element* p=(Element*)malloc(sizeof(Element));; p->num=val; p->suivant=l; return p; } int Length(Element* l) { unsigned char count=0; while (l != NULL) { count++; l = l->suivant; } return count; } void main() { int x,d; Element* p=(Element*)malloc(sizeof(Element)); Element* first=p; do { saisie(p); printf("voulez-vous continuer ? si oui taper 1 sinon taper 0\n"); scanf("%d",&x); p=p->suivant; } while(x==1); p=insertHead(first,10); d=Length(p); while(p!=NULL) { printf("%d \n",p->num); p=p->suivant; } printf("longueur = %d ",d); getchar(); }
@+
merci pour la réponse Pacorabanix,j'ai compris le principe mais tous mes tentatives pour corriger la fonction inserthead ont échoué :(
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
29 déc. 2009 à 04:16
29 déc. 2009 à 04:16
comment as-tu modifié ton code ? donne le main(), la fonction inserer et tes éventuelles erreurs ;)
n'oublie pas les balises code si possible
n'oublie pas les balises code si possible
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
29 déc. 2009 à 08:08
29 déc. 2009 à 08:08
Salut,
je vient de re-tester...y'a un bug avec la saisi du zero....mais sur le principe il fonctionne...
voila le resultat:
donner un entier16
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier13
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier19
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier46
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier50
voulez-vous continuer ? si oui taper 1 sinon taper 0
0
10
0
16
13
19
46
50
longueur = 7
Process returned 10 (0xA) execution time : 20.942 s
Press any key to continue.
je vient de re-tester...y'a un bug avec la saisi du zero....mais sur le principe il fonctionne...
voila le resultat:
donner un entier16
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier13
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier19
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier46
voulez-vous continuer ? si oui taper 1 sinon taper 0
1
donner un entier50
voulez-vous continuer ? si oui taper 1 sinon taper 0
0
10
0
16
13
19
46
50
longueur = 7
Process returned 10 (0xA) execution time : 20.942 s
Press any key to continue.
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
29 déc. 2009 à 19:00
29 déc. 2009 à 19:00
ok, cool. Penchons-nous sur ce bug.
Poste ton code (complet et avec les balises code)
Poste ton code (complet et avec les balises code)
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
29 déc. 2009 à 19:32
29 déc. 2009 à 19:32
Salut,
c'est le poste N°2...mais ce prog me servir pas....c'est pour ENITIEN....
c'est le poste N°2...mais ce prog me servir pas....c'est pour ENITIEN....
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
29 déc. 2009 à 20:27
29 déc. 2009 à 20:27
désolé, lu trop vite!