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 ajout élément table de hachage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut Problème ajout élément table de hachage
    Bonjour,

    Je suis sur un projet qui consiste a créer un dictionnaire d'un texte et de lister l'ensemble des positions des mots dans le texte... Jusque là pour moi pas de problèmes, j'ai finit le projet rapidement seulement le problème c'est que l'ajout des positions s'effectue correctement, mais les mots sont entièrement modifiés a chaque fois....

    Exemple :
    J'ajoute "plop" a ma table qui a un indice 56 par une fonction de hachage quelconque et qui a la position 5558
    Dans la table j'ai dejà (si la saisie fonctionnait):
    yop -> 0 55
    youpi -> 60 85
    Et bien avec ma fonction j'obtiens
    plop -> 0 55
    plop -> 60 85
    .....
    plop -> 56

    Je cherche depuis 2 jours et je ne trouve pas le pb ... J'espère que vous pourriez m'aider.... Merci


    Details techniques :
    Le programme ajoute les mots extraits du fichier dans la table de hachage. On ajoute les elements en suivant un hachage ouvert (donc par liste chainée)
    En gros, une case de la table pointe vers une cellule qui contient le mot et qui pointe vers la liste des positions sachant qu'une case de la table est une liste de cellules pointant vers des mots de même indice (gestion des collisions)

    Trèves de blabla voici le 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
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     
    #define TAILLE_MAX 65536
    .....
    typedef struct celpos{
    	long position;
    	struct celpos *suivant;
    }Celpos, *Listpos;
     
    typedef struct celmot{
    	char *mot;
    	Listpos nb_pos;
    }Celmot, *ListeMot;
     
    typedef struct cellule{
    	Celmot *valeur;
    	struct cellule *suivant;
    }Cellule, *Liste;
    .....
     
    Liste AlloueCellule(void){
    	Liste tmp;
    	tmp=(Liste)malloc(sizeof(Cellule));
    	if(tmp!=NULL){
    		tmp->valeur=NULL;
    		tmp->suivant=NULL;
        }
    	return tmp;
    }
     
    ListeMot AlloueCelmot(char* x){
    	ListeMot tmp;
    	tmp=(ListeMot)malloc(sizeof(Celmot));
    	if(tmp!=NULL){
    		tmp->mot=x;
    		tmp->nb_pos=NULL;
    	}
    	return tmp;
    }
     
    Listpos AlloueCelpos(long y){
    	Listpos tmp;
    	tmp=(Listpos)malloc(sizeof(Celpos));
    	if(tmp!=NULL){
    		tmp->position=y;
    		tmp->suivant=NULL;
    	}
    	return tmp;
    }
     
    Liste* ajouter_mot(char* mot, long position,Liste* table_hachage){
        Liste* pointeur_table = table_hachage;
        unsigned int indice = 0;
        ListeMot temp_mot = NULL;
        Listpos temp_pos = NULL;
        Liste temp = NULL;
        Liste Indexmot = NULL;
        Listpos Index = NULL;
        indice = (hachage(mot))%TAILLE_MAX;
        Liste pointeur_case = table_hachage[indice];
        if(pointeur_case->valeur == NULL){
            temp_mot = AlloueCelmot(mot);
            temp_pos = AlloueCelpos(position);
            temp_mot->nb_pos = temp_pos;
            pointeur_case->valeur = temp_mot;
        } else {
            if(strcmp(mot,table_hachage[indice]->valeur->mot)==0){
               Index = table_hachage[indice]->valeur->nb_pos;
               while(Index->suivant!=NULL){
                  Index = Index->suivant;
               }
               temp_pos = AlloueCelpos(position);
               Index->suivant = temp_pos;
            } else {
               while(table_hachage[indice]->suivant!=NULL){
                   table_hachage[indice] = table_hachage[indice]->suivant;
               }
               temp = AlloueCellule();
               temp_mot = AlloueCelmot(mot);
               temp_pos = AlloueCelpos(position);
               temp_mot->nb_pos = temp_pos;
               temp->valeur = temp_mot;
               table_hachage[indice] = temp;
            }
        }
        return pointeur_table;
    }

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Il faut que tu utilises malloc et strcpy pour :

    En effet là tu fais pointer 'mot' sur 'x'. Mais 'x' change tout au long du programme pour à la fin avoir la valeur "plop". Du coup comme tous tes pointeurs pointent sur la même case mémoire ils ont tous la même valeur

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut
    Ahhh oui.... Bien sur....

    Merci beaucoup.... Je met résolu tout de suite....

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

Discussions similaires

  1. [XML] Problème ajout éléments dans fichier XML
    Par QAYS dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/09/2011, 23h36
  2. association ManyToMany : problème ajout dans table
    Par cecile38 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 19/07/2011, 09h18
  3. problème ajout d'éléments par le code
    Par xav2303 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/04/2009, 21h28
  4. Réponses: 8
    Dernier message: 29/08/2008, 14h53
  5. Réponses: 3
    Dernier message: 14/02/2008, 11h01

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