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 :

Table de hachage fermée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut Table de hachage fermée
    Bonjour a vous tous,

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #define _GNU_SOURCE
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef enum {LIBRE, DISPO, OCCUPE} Etat;
     
    typedef struct tab
    {
     char **Tab;
     int Taille;
     Etat *Flag;
    } Hachage;
     
    Hachage *Alloue (int n)
    {
     int i;
     /* On teste la valeur du parametre qui representera la taille de notre tableau */
     if (n<0 || n==0) {fprintf(stderr,"Erreur de la taille pour le tableau\n");return NULL;} 
     /* On alloue la structure */ 
     Hachage *T = malloc(sizeof (Hachage));
     if (!T) {fprintf(stderr,"Erreur lors de l'allocation de la strucutre Hachage\n");return NULL;} 
     /* On alloue le tableau */
     T->Taille = n;
     T->Tab = NULL;                           /* Initialiser !! */
     /* On initialise les cases du flag */
     T->Flag = malloc(sizeof(int)*T->Taille);
      for (i=0;i<T->Taille;i++)
        T->Flag[i] = LIBRE;
    /* On retourne le pointeur sur la structure initialisé */
     return T;
     
    int Hache (Hachage *T, char *cle)
    {
     int ValeurHache=0;
     int i;
     while (cle[i] != '\0')
        {
         ValeurHache += cle[i] ;
         i++;
       }
     return ValeurHache;
    }
     
    int Ajoute (Hachage *T, char *mot)
    {
     int hache = Hache (T,mot);
     int cpt=0;
     while (T->Flag[i] == OCCUPE)
         {
          hache = (hache+1)%T->Taille;
          cpt++;
          if (cpt == hache) 
             return -1;
         }
     T->Tab[hache] = strdup(mot);
     T->Flag[hache] = OCCUPE;
     return 0;
    }
    J'ai une erreur de segmentation. Je pense que ca vient de la fonction ajout. Mais je ne suis pas sur
    Car j'ai fait un valgrind juste avec ajout il n'y avait pas d'erreur donc...

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #define _GNU_SOURCE
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef enum {LIBRE, DISPO, OCCUPE} Etat;
     
    typedef struct tab
    {
     char **Tab;
     int Taille;
     Etat *Flag;
    } Hachage;
     
    Hachage *Alloue (int n)
    {
     int i;
     /* On teste la valeur du parametre qui representera la taille de notre tableau */
     if (n<0 || n==0) {fprintf(stderr,"Erreur de la taille pour le tableau\n");return NULL;}
     /* On alloue la structure */
     Hachage *T = malloc(sizeof (Hachage));
     if (!T) {fprintf(stderr,"Erreur lors de l'allocation de la strucutre Hachage\n");return NULL;}
     /* On alloue le tableau */
     T->Taille = n;
     T->Tab = NULL;
     /* On initialise les cases du flag */
     T->Flag = malloc(sizeof(int)*T->Taille);
      for (i=0;i<T->Taille;i++)
        T->Flag[i] = LIBRE;
    /* On retourne le pointeur sur la structure initialisé */
     return T;
    }
     
    int Hache ( char *cle)
    {
     int ValeurHache=0;
     int i;
     while (cle[i] != '\0')// <= i a une valeur indéterminé
        {
         ValeurHache += cle[i] ;
         i++;
       }
     return ValeurHache;
    }
     
    int Ajoute (Hachage *T, char *mot)
    {
     int hache = Hache (mot);
     int i = hache;
     while (T->Flag[i] == OCCUPE)
         {
          i = (i+1)%T->Taille;
          if (i==hache)
             return -1;
         }
     T->Tab[hache] = strdup(mot);
     T->Flag[hache] = OCCUPE;
     return 0;
    }

  3. #3
    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
    int Hache (Hachage *T, char *cle)
    {
     int ValeurHache=0;
     int i;
     while (cle[i] != '\0') // i n'est pas initialisé !
        {
         ValeurHache += cle[i] ;
         i++;
       }
     return ValeurHache;
    }

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Oui effectivement ca m'enleve 7 erreurs dans mon valgrind.lol
    Mais malheureusement j'ai toujours mon erreur de segmentation...

    Merci pour votre aide !!

    [edit]: j'ai trouvé une erreur sur la fonction Hache. J'ai oublié de faire modulo la taille de mon tableau
    Mais il me reste mon erreur de seg ca viendrait de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T->Tab[hache] = strdup(mot);

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Par défaut
    La table des mots T->Tab[] doit être allouée ...

    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
    Hachage *Alloue (int n)
    {
     int i;
     /* On teste la valeur du parametre qui representera la taille de notre tableau */
     if (n<0 || n==0) {fprintf(stderr,"Erreur de la taille pour le tableau\n");return NULL;} 
     /* On alloue la structure */ 
     Hachage *T = malloc(sizeof (Hachage));
     if (!T) {fprintf(stderr,"Erreur lors de l'allocation de la strucutre Hachage\n");return NULL;} 
     /* On alloue le tableau */
     T->Taille = n;
     T->Tab = malloc(sizeof(char*)*n);
     /* On initialise les cases du flag */
     T->Flag = malloc(sizeof(int)*T->Taille);
      for (i=0;i<T->Taille;i++)
        T->Flag[i] = LIBRE;
    /* On retourne le pointeur sur la structure initialisé */
     return T;
    }

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Effectivement j'avais oublié ce petit detail
    Merci a vous !

    Bonne soirée

    [edit] Une petite question, pour liberer la memoire...
    Pour les deux tableaux et la structure ca va. Mais la place en memoire pour les chaines de caracteres... comment fait on pour la liberer? Merci d'avance

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2007, 10h34
  2. table de hachage
    Par mrtatou dans le forum Langage
    Réponses: 4
    Dernier message: 18/01/2006, 09h41
  3. Table de hachage
    Par Gryzzly dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 25/12/2005, 17h31
  4. [Conception] Table de hachage et doublons de clés
    Par mammou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/05/2004, 19h16
  5. Réponses: 2
    Dernier message: 05/02/2004, 12h54

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