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 :

Liste chainée simple


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut Liste chainée simple
    Bonjour,
    Voila j'ai une seg fault, je pense que ca vient de cette partie de mon programme, j'ai l'impression qu'elle ne m'insère jamais l'élément new dans me liste...
    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
    20
    21
    22
    23
    24
    25
    26
    27
     
    typedef struct cellule_t
    {
     struct cellule_t *SuivListe;
     Arbre Huff;
    } cellule, *Liste;
     
    /* Insere un element en respectant l'ordre croissant de la liste */
    void Insere(Liste *p, Liste CellInsere)
    {
     Liste ptr = *p;
     /* Si on doit l'inserer au debut de la liste */
     if (ptr->Huff->Freq > CellInsere->Huff->Freq)
       {
        CellInsere->SuivListe = *p;
        *p=CellInsere;
       }
     /* On teste ou on doit s'arreter pour inserer notre nouveau element */
     while (ptr->SuivListe && CellInsere->Huff->Freq > ptr->SuivListe->Huff->Freq)
      ptr=ptr->SuivListe;
     if(ptr->SuivListe)
      {
       CellInsere->SuivListe = ptr->SuivListe;
       ptr->SuivListe = CellInsere;    /* il manquait ->SuivListe pour ptr */
      }
     else ptr->SuivListe = CellInsere;
    }
    merci pour votre aide

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est un peu le bazar pour faire la différence entre la liste complète, un noeud de la liste et un item géré par un noeud de la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct cellule
    {
     struct cellule *SuivListe;
     Arbre Huff;
    } cellule, *Liste;
    Ce code déclare une structure qui s'appelle 'cellule' et un typedef qui s'appelle aussi 'cellule', il peut y avoir des risques de collision de nom.
    Je te conseille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct cellule
    {
     struct cellule *SuivListe;
     Arbre Huff;
    } cellule_t, *Liste;
    Ta fonction void Insere(Liste *p, Liste new) recoit l'adresse du pointeur de la liste (du moins c'est ce que je comprends). Elle ne teste pas si le pointeur de liste est NULL (cela risque/va être le cas si la liste est vide au début)

    Je ne voie pas le malloc de nouveau noeud quand tu insères un item

    Autre chose moins grave, le paramètre de la fonction insere() ne devrait pas s'appeler new car c'est un mot clé du C++ (pas du C, je suis d'accord mais autant prendre les bonnes habitudes)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci pour votre réponse, j'ai fait les modifications que vous m'avez conseillé, et j'ai testé les deux paramètre de ma fonction.

    L'allocation de "new" devenu CellInsere se fait dans une autre fonction avant l'appel de Insere.

    Malgré cela mon seg fault perdure

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    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 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BatuBou Voir le message
    Merci pour votre réponse, j'ai fait les modifications que vous m'avez conseillé, et j'ai testé les deux paramètre de ma fonction.

    L'allocation de "new" devenu CellInsere se fait dans une autre fonction avant l'appel de Insere.

    Malgré cela mon seg fault perdure
    Le problème c'est que généralement les débutants confondent "liste" et "membre de la liste" (ou noeud).
    Ce qui est dans la liste, c'est un noeud.
    La liste, c'est simplement le premier noeud.

    Au premier abord, on peut effectivement se dire que "noeud" ou "premier noeud" c'est pareil sauf quand on insère en début de liste (et que le premier noeud change). Là, on arrive forcément dans le cas où il faut modifier l'adresse du premier noeud 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 "cellule étoile" (ou un "struct cellule_t étoile")
    Une autre solution qui est plus intéressante consiste à 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 supprimant ce "Liste" et en lui rajoutant ce "t_liste". Certes cela va te prendre un peu de temps mais tu le récupèreras ensuite au centuple. Et accessoirement cela peut t'aider à trouver ton bug qui n'est peut-être pas dans la partie citée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci pour votre réponse
    Mais je vais continuer a chercher mon erreur sans modifier ma structure...
    J'ai déjà trouvé une erreur dans mon code qui faisait que je n'insérais pas mes éléments...

    Mon erreur de seg est bien dans cette partie, c'est quand je souhaite rajouté un élément a la fin de la liste.

    Merci encore

    ps: J'ai modifié mon premier poste

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    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 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BatuBou Voir le message
    Merci pour votre réponse
    Mais je vais continuer a chercher mon erreur sans modifier ma structure...
    Pas de problème. Chacun est libre. L'important c'est que tu aies compris l'idée. Plus tard, je pense que tu y viendras (ou y reviendras) tout seul et là ça te sera plus facile.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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
    20
    21
    22
    void Insere(Liste *p, Liste CellInsere)
    {
       Liste ptr = *p;
       /* Si on doit l'inserer au debut de la liste */
       if (ptr ==NULL || ptr->Huff->Freq > CellInsere->Huff->Freq)
       {
        CellInsere->SuivListe = *p;
        *p=CellInsere;
       }
      else
      {
       /* On teste ou on doit s'arreter pour inserer notre nouveau element */
       while (ptr->SuivListe && CellInsere->Huff->Freq > ptr->SuivListe->Huff->Freq)
         ptr=ptr->SuivListe;
         if(ptr->SuivListe)
         {
           CellInsere->SuivListe = ptr->SuivListe;
           ptr->SuivListe = CellInsere;    /* il manquait ->SuivListe pour ptr */
         }
        else ptr->SuivListe = CellInsere;
      }
    }

Discussions similaires

  1. Liste chainée simple
    Par boula dans le forum C
    Réponses: 9
    Dernier message: 23/05/2008, 22h32
  2. Liste chaine simple
    Par boula dans le forum C
    Réponses: 6
    Dernier message: 21/05/2008, 11h10
  3. [Liste Chainée Simple]_Sentinelle_
    Par orfix dans le forum C
    Réponses: 28
    Dernier message: 04/03/2008, 22h21
  4. liste chaine simple
    Par el baz dans le forum C
    Réponses: 8
    Dernier message: 03/08/2007, 20h54
  5. un probléme de liste chainé simple
    Par seifdev dans le forum C
    Réponses: 15
    Dernier message: 02/04/2007, 16h36

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