IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur dans la fct supprimer//liste


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Erreur dans la fct supprimer//liste
    Salut a tout

    j'ecris la fonction qui supprime le premier element dans une liste chainee
    mais il y a une erreur !!! ??? je ne sais pas pourquoi

    la definition de type Cell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Cell { char val ;
    			     struct Cel *suiv ;
    			  };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      int supprim_debut(Liste *a)
    {
    Cell *p;
     if (a!=NULL)
     {
     p=*a;
    
     a=(*a).suiv ; l'erreur ici  
     free(p);
     return 1;
     }
     else
     return 0;
    }
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 042
    Points
    31 042
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Myran Voir le message
    Salut a tout

    j'ecris la fonction qui supprime le premier element dans une liste chainee
    mais il y a une erreur !!! ??? je ne sais pas pourquoi

    la definition de type Cell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Cell { char val ;
    			     struct Cel *suiv ;
    			  };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      int supprim_debut(Liste *a)
    {
    Cell *p;
     if (a!=NULL)
     {
     p=*a;
    
     a=(*a).lien ; l'erreur ici  
     free(p);
     return 1;
     }
     else
     return 0;
    }
    Merci d'avance
    Je vois pas trop ce que peut être ce mystérieux membre "lien" que tu cites ??? Il n'est défini nulle-part dans ta structure.
    Par ailleurs, "(*pt).membre" s'écrit plus simplement "pt->membre".

    Maintenant tu fais l'erreur classique de tout débutant qui commence les listes => tu as bien intégré le type "cellule" mais tu as négligé le type "liste"

    Ce qui est dans la liste, c'est une cellule. On est d'accord. Cependant tu as aussi un truc qui est ta "liste" et qui est simplement la première cellule.

    Au premier abord, on peut effectivement se dire que "cellule" ou "première cellule" c'est pareil donc inutile sauf quand on insère ou qu'on supprime en début de liste (et que la première cellule change). Là, on arrive forcément dans le cas où il faut modifier l'adresse de la première cellule ce qui oblige à travailler avec l'adresse d'une adresse. Et inquiet par cette manipulation de "étoile étoile" on va masquer la première étoile derrière un nom de type d'où ce "Liste" qui représente en fait dans ton cas un "cel étoile".
    Donc c'est pour ça qu'on préconise aussi de créer un type spécifique à la liste. Puisque la liste c'est "ce qui contient la première cellule" ben on le décrit ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct {
        cellule *first;
    } t_liste;
    D'une part, cela reporte le problème de "l'étoile étoile" puisque une fonction qui doit manipuler une liste recevra un "t_liste *truc" et pourra à loisir s'amuser à modifier "truc->first" si le besoin s'en fait sentir, mais cela permet ensuite d'enrichir ce type en lui rajoutant au besoin un pointeur sur le dernier élément, le nombre d'éléments et tutti quanti.

    Donc si je devais te donner un conseil, ce serait de reprendre ton code "plus en profondeur" en y rajoutant ce "t_liste". Certes cela va te prendre un peu de temps mais tu le récupèreras ensuite au centuple en te simplifiant ensuite la gestion de ta liste.

    Accessoirement je te recommande aussi de nommer tes types "t_xxx" ce qui te permettra de pas confondre "type" et "variable" et de garder le token "xxx" disponible pour un nom de variable...

    Par exemple voici comment j'aurais écrit ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    typedef struct s_cell {
        char val ;
        struct s_cell *suiv ;
    } t_cell;
     
    typedef struct {
        t_cell *first;
    } t_liste;
     
    int supprim_debut(t_liste *liste)
    {
        t_cell *first;
        if (liste == NULL || liste->first == NULL) return 0;
     
        first=liste->first;
        list->first=liste->first->suiv;
        free(first);
        return 1;
    }

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour

    Merci beaucoup de votre aide sve@r

    Je vois pas trop ce que peut être ce mystérieux membre "lien" que tu cites ??? Il n'est défini nulle-part dans ta structure.
    Ah!! oui c'est une erreur en ecriture

    "(*pt).membre" s'écrit plus simplement "pt->membre"
    mais le prof nous etude que faire (*pt).membre

    je vous remercie encore

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Myran Voir le message
    mais le prof nous etude que faire (*pt).membre
    Tu peux le refaire en français ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/01/2016, 16h21
  2. erreur dans /etc/apt/sources.list
    Par patricx dans le forum Debian
    Réponses: 1
    Dernier message: 08/02/2012, 19h00
  3. Réponses: 1
    Dernier message: 06/06/2006, 17h52
  4. [MySQL] Erreur d'affichage d'un listing php dans un html
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 10/04/2006, 22h13
  5. Réponses: 9
    Dernier message: 04/04/2006, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo