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
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.
A voir également:

6 réponses

est-ce que quelqu'un peut m'aider svp?
1
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
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.
1
merci pour ton post très utile :)
svp est ce que tu peux m'expliquer d'avantage comment je peux passer premier elle même(oui mon p c'est premier)
et pourquoi utiliser free alors que je vais accéder aux éléments de la liste ultérieurement?
0
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
regarde, c'est comme cet exemple:

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.
0
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
Salut,
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();
}

@+
0
le programme que tu m'as donné ne marche pas.je crois qu'il y a un problème dans la fonction saisie.
en plus,est-ce qu'on peut pas ecrire une fonction inserthead qui ne retourne rien(void)?
0
merci pour la réponse Pacorabanix,j'ai compris le principe mais tous mes tentatives pour corriger la fonction inserthead ont échoué :(
0
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
comment as-tu modifié ton code ? donne le main(), la fonction inserer et tes éventuelles erreurs ;)
n'oublie pas les balises code si possible
0

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
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.
0
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
ok, cool. Penchons-nous sur ce bug.

Poste ton code (complet et avec les balises code)
0
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
Salut,
c'est le poste N°2...mais ce prog me servir pas....c'est pour ENITIEN....
0
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
désolé, lu trop vite!
0