Liste chainée : Insertion en tête de liste
ENITIEN
-
Pacorabanix Messages postés 4122 Date d'inscription Statut Membre Dernière intervention -
Pacorabanix Messages postés 4122 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je me bloque depuis le matin sur ce programme :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct element
{
int num;
struct element* suivant;};
struct element* premier = NULL ;
void saisie()
{struct element* p = premier ;
premier=(struct element*)malloc(sizeof(struct element));
premier->suivant=p;
printf("donner un entier");
scanf("%d",&premier->num);
}
void insertHead(struct element* l, int val)
{
struct element* p=l;
l=(struct element*)malloc(sizeof(struct element));
(l->suivant )= p;
(l->num)= val;
}
int Length(struct element* l)
{
struct element* current = l;
int count = 0;
while (current != NULL) {
count++;
current = current->suivant;
}
return count;
}
void main()
{int x,d;struct element* p;
do
{saisie();
printf("voulez-vous continuer ? si oui taper 1 sinon taper 0\n");
scanf("%d",&x);
}
while(x==1);
insertHead(premier,10);
for(p=premier;p!=NULL;p=p->suivant)
{printf("%d \n",p->num);}
d=Length(premier);
printf("longueur = %d ",d);
getch();}
ce programme n'affiche pas d'erreurs mais la fonction inserthead ne fonctionne pas:
à l'exécution je trouve que les éléments que j'ai saisi avec la fonction saisie
merci d'avance.
je me bloque depuis le matin sur ce programme :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct element
{
int num;
struct element* suivant;};
struct element* premier = NULL ;
void saisie()
{struct element* p = premier ;
premier=(struct element*)malloc(sizeof(struct element));
premier->suivant=p;
printf("donner un entier");
scanf("%d",&premier->num);
}
void insertHead(struct element* l, int val)
{
struct element* p=l;
l=(struct element*)malloc(sizeof(struct element));
(l->suivant )= p;
(l->num)= val;
}
int Length(struct element* l)
{
struct element* current = l;
int count = 0;
while (current != NULL) {
count++;
current = current->suivant;
}
return count;
}
void main()
{int x,d;struct element* p;
do
{saisie();
printf("voulez-vous continuer ? si oui taper 1 sinon taper 0\n");
scanf("%d",&x);
}
while(x==1);
insertHead(premier,10);
for(p=premier;p!=NULL;p=p->suivant)
{printf("%d \n",p->num);}
d=Length(premier);
printf("longueur = %d ",d);
getch();}
ce programme n'affiche pas d'erreurs mais la fonction inserthead ne fonctionne pas:
à l'exécution je trouve que les éléments que j'ai saisi avec la fonction saisie
merci d'avance.
A voir également:
- Liste chainée : Insertion en tête de liste
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
6 réponses
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.
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.
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é :(
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.