Bonjour à tous,
Mon problème est le suivant:
Mon programme créé à partir de la lecture d'un fichier texte une liste chainée double.
Chaque structure contient les informations d'un élève (nom,prénom,...).
Jusque là tout va bien, ensuite j'ai fais une table de hachage comportant une fonction de hachage et de double hachage.
Chaque case (à l'index correspondant à la clé haché) contient le pointeur current qui parcoure la liste.
Donc en résumé, j'ai un tableau de pointeur de structure ELEVE.
Le soucis est que lorsque je veux afficher les valeurs de mon tableau,
ça marche nickel avec les nom (table[i]->nom) mais lorsque je le fais avec prénom ça plante.
Avec les autres aussi, avec initial ça affiche quelque ligne correct puis ça plante, email pareil.
MAX_TAB est une variable, les autres MAX_... sont des constantes.
Voici le code:
je déclare un tableau dynamique dans le main et l'initialise:
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 typedef struct DATA LISTE{ int taille; LISTE *first; }; typedef struct DATA2 ELEVE{ char nom[MAX_NOM]; char prenom[MAX_PRENOM]; char initial[MAX_INITIAL]; char email[MAX_EMAIL]; char num_tel[MAX_NUMTEL]; char classe[MAX_CLASSE]; ELEVE *next; ELEVE *previous; };
Les fonctions de hachage:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ELEVE **table=malloc(MAX_TAB * sizeof(ELEVE)); memset(table,0,MAX_TAB * sizeof(ELEVE));
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 void table_hash(ELEVE** table,LISTE *list) { ELEVE *current = list->first->next; int i,key=0; while(current!=NULL) { key = hash(current->nom,current->prenom); for(i=0;table[key]!=NULL;i++) { key=(key+(i*(hash(current->nom,current->prenom)))) % MAX_TAB; key++; } table[key] = current; key=0; current = current->next; } } void print_table(ELEVE** table) { int i; for(i=0;i<MAX_TAB;i++) { printf("\n case %d : %s",i,table[i]->prenom); } } int hash(char nom[MAX_NOM],char prenom[MAX_PRENOM]) { int key=0; key = (nom[0]+nom[strlen(nom)-1]) * strlen(nom); key += ((prenom[0]+prenom[strlen(prenom)-1])*strlen(prenom)); return (key%MAX_TAB); }
Partager