Liste chainée : Insertion en tête de liste

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.
Configuration: Windows Vista
Firefox 3.5.6

6 réponses

  1. est-ce que quelqu'un peut m'aider svp?
    1
    1. 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
      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
      2. @ENITIENregarde, 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
    2. 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
      1. 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
    3. merci pour la réponse Pacorabanix,j'ai compris le principe mais tous mes tentatives pour corriger la fonction inserthead ont échoué :(
      0
      1. 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
    4. 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
      1. ok, cool. Penchons-nous sur ce bug.

        Poste ton code (complet et avec les balises code)
        0
    5. Salut,
      c'est le poste N°2...mais ce prog me servir pas....c'est pour ENITIEN....
      0
      1. désolé, lu trop vite!
        0