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 :

Problème fabrication liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Problème fabrication liste chainée
    Bonjour,

    J'ai fait une fonction qui doit créer une liste chainé avec une chaine de caractère passé en paramètre. Chaque caractère de la chaine étant unique dans la liste, seul le nombre d'occurrence change lorsque 2 fois la même lettre est trouvé. Seulement lors de l'exécution le programme plante d'un coup (je suis sous windows). Voici le code des 2 fonctions:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    liste liste_caractere (const char *chaine)
    {
        liste l = NULL;
        arbrepoids ap;
        int n = 256;
        char *tab = malloc(n * sizeof (char));
        int nb_car_differents = 0;
        int ind1_chaine = 0;
        int ind2_chaine = 0, frequence = 0;
        int i = 0;
        /* Tant que l'on n'arrive pas a la fin de la chaine */
        while (chaine[ind1_chaine] != '\0')
        {
            /* On calcul la frequence du caractere */
            frequence = 0;
            ind2_chaine = 0;
            while (chaine[ind2_chaine] != '\0')
            {
                if (chaine[ind2_chaine] == chaine[ind1_chaine])
                {
                    frequence++;
                }
                ind2_chaine++;
            }
            ap.element = feuille (chaine[ind1_chaine]);
            ap.poids = frequence;
            /* On verifie que l'element n'a pas deja ete ajoute a la liste */
            for (i=0;i<=nb_car_differents;i++)
            {
                /* Si on ne l'a pas trouve */
                if (i == nb_car_differents)
                {
                    l = creer_liste (ap, l);
                    nb_car_differents++;
                    tab[i] = ap.element->data;
                    break;
                }
                /* Si on l'a trouve */
                if (ap.element->data == tab[i])
                {
                    break;
                }
            }
            ind1_chaine++;
        }
        free (tab);
        tab = NULL;
     
        return l;
    }
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    liste creation_liste (arbrepoids e, liste l)
    {
        /* Allocation memoire */
        liste ma_liste = malloc (sizeof (ma_liste));
        if (ma_liste)
        {
            liste ptr_l = l;
            ma_liste->data = e;
            ma_liste->suivant = NULL;
            /* Cas de l'insertion dans une liste nulle */
            if (l == NULL)
            {
                return ma_liste;
            }
            /* Cas de l'insertion en tete de liste */
            if (ma_liste->data.poids < ptr_l->data.poids)
            {
                ma_liste->suivant = ptr_l;
     
                return ma_liste;
            }
            /* Cas autres */
            while (ptr_l->suivant != NULL && ptr_l->suivant->data.poids < ma_liste->data.poids)
            {
                ptr_l = ptr_l->suivant;
            }
            /* Insertion apres */
            ma_liste->suivant = ptr_l->suivant;
            ptr_l->suivant = ma_liste;
     
            return l;
        }
        else
        {
            exit (0);
        }
     
        return NULL;
    }
    Et les structures et les fonctions feuille et noeud qui vont avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	arbre element;
    	int poids;
    } arbrepoids;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct liste {
    	arbrepoids data;
    	struct liste *suivant;
    } *liste;
    Merci à tout ceux qui pourront m'aider à trouver ce qui va pas

  2. #2
    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
    liste creation_liste (arbrepoids e, liste l)
    {
        /* Allocation memoire */
        liste ma_liste = malloc (sizeof (*ma_liste));
    Sinon tu n'alloues que la taille d'un pointeur.

    (C'est à mon avis une mauvaise idée de cacher un pointeur par un typedef comme dans liste)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Merci beaucoup c'était bien cela Sinon je pense la même chose mais ceci est imposé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème free() liste chainée
    Par samzorINCA dans le forum Débuter
    Réponses: 28
    Dernier message: 19/05/2010, 10h02
  2. Problème de liste chainée
    Par SPACHFR dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2009, 15h39
  3. Problème de listes chainées
    Par line86 dans le forum C
    Réponses: 5
    Dernier message: 20/04/2008, 10h30
  4. Probléme avec Liste Chainée
    Par Lucas42 dans le forum C
    Réponses: 6
    Dernier message: 24/01/2008, 20h15
  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