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; }
Partager