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

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

6 réponses

  1. ENITIEN
     
    est-ce que quelqu'un peut m'aider svp?
    1
  2. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     
    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. ENITIEN
       
      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
      1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663 > ENITIEN
         
        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
  3. chuka Messages postés 980 Statut Membre 379
     
    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. ENITIEN
       
      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
  4. ENITIEN
     
    merci pour la réponse Pacorabanix,j'ai compris le principe mais tous mes tentatives pour corriger la fonction inserthead ont échoué :(
    0
    1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. chuka Messages postés 980 Statut Membre 379
     
    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. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
       
      ok, cool. Penchons-nous sur ce bug.

      Poste ton code (complet et avec les balises code)
      0
  7. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    c'est le poste N°2...mais ce prog me servir pas....c'est pour ENITIEN....
    0
    1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
       
      désolé, lu trop vite!
      0