Table de Hachage de patronyme en C

guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   -  
Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voilà je dois créer une table de hashage de patronymes par le biais de N entrées, par exemple 20, de pointeurs vers des chaines de caracteres. L'utilisateur est invité de manière répétitive à choisir une commande parmi insérer, rechercher, supprimer et fin. Les noms sont des suites de caractères minuscules exclusivement.

La fonction de hashage calculera un indice dans le tableau en formant la "somme" des caractères du noms sachant que "a" vaut 1. Cette somme modulo N sera l'entrée utiliséee dans la table à moins que celle-ci ne soit déjà occupé. Dans ce cas, on rehashe en ajoutant 13 fois la valeur du premier caractère jusqu'à trouver une entrée libre ou à abandonner au bout de 5 échecs.

Toutes les opérations du programme sont imprimées au fur et à mesure de sorte que l'on puisse par exemple apprendre que la 5e entrée est déjà occupée, que le rehashage choisit ensuite la 3e qui est libre.

Souvenez-vous que la suppression de noms du tableau a une incidence sur les conflits, et donc les recherches des noms dans la tables entre autres.



J'ai déjà écrit ceci mais mon compilation fon,ctionne mais dés que j'éxecute aprész avoir insérer un nom j'ai comme message: "An unhandled win32 occured. Je travaille avec devcpp.

Que puis-je faire?


#include <stdlib.h>
#include <string.h>
#define N 20
char *T[N];
int i;

int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1;
for(i=0;i<(strlen(s)-1);i++)
{
temp=s[i];
compteur=compteur +(temp-96);
}
while(n<5)
{
if(T[compteur%N]!=0)
{
temp=s[0];
compteur=compteur + 13*temp;
n++;
}
else
{
s1=s[0];
*T[compteur%N]=s1;
return 1;
}
}
return 0;
}



int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i])
return 0;
else
return 1;
}
}

int supprimer(char *s)
{
for(i=0;i<N;i++)
{
if(strcmp(T[i],s)!=0)
return 0;
else
{
T[i]=NULL;
return 1;
}
}
}

int main()
{
char *s,patro;
int i;
int choix;
for(i=0; i<N; i++) /*initialisiation de T a 0*/
T[i]=0;
for(i=0; i<N; i++)
{
printf("%s", T[i]);
printf("\n");
}
int bool=1; //booleen

while(bool)
{
printf("Entrez votre choix \n");
printf("1-Inserer \n");
printf("2-Rechercher \n");
printf("3-Supprimer \n");
printf("4-Fin du programme \n");

if(scanf("%d",&choix)==0)
return EXIT_FAILURE;

switch(choix)
{
case 1:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
printf("Vous avez choisi la commande inserer \n");
*s=patro;
if(inserer(s)==0)
printf("Le patronyme n'a pu etre inserer \n");
else
printf("Le patronyme a été inserer \n");
break;

case 2:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande rechercher \n");
if(rechercher(s)==0)
printf("Le patronyme n'est pas présent dans le tableau \n");
else
printf("Le patronyme est présent dans le tableau \n");
break;

case 3:

printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande supprimer \n");
if(supprimer(s)==0)
printf("Le patronyme ne fait pas partit du tableau et n'a donc pas pu etre supprimer \n");
else
printf("Le patronyme a bien été supprimer avec succes \n");
break;

case 4:

printf("Vous avez choisi la commande fin \n");
bool=0;
return EXIT_SUCCESS;
break;
default:
printf("Vous n'avez pas choisi une commande valide \n");
printf("Veuillez refaire un choix \n");
printf("\n");
break;

}
}
return EXIT_SUCCESS;
}

Merci
A voir également:

5 réponses

Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
Salut,

Tout d'abord, tu n'attribues pas d'espace mémoire pour tes chaines de caractères. Ensuite tu fais des affectations avec l'opérateur = qui ne fonctionne pas aussi simplement avec des char *

Et il faut relire ton code, il y a beaucoup de choses de ce genre qui font que ton code n'est pas propre.

Bon courage
0
guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   53
 
Justement, peux-tu essayer de m'expliquer brièvement les affectations avec des chars * car jje galère avec ça.
0
Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
Et bien d'abord il te faut allouer de l'espace mémoire à tes char *, avec la fonction new par exemple. Ca te ferait un truc du genre :
patro = new char [20];
A toi de mettre l'espace que tu veux allouer. Attention, il faut également libérer l'espace mémoire une fois que tu as terminée ce que tu avais à faire. Cela se fait avec la fonction delete :
delete [] patro;

Pour copier patro dans s, il te faut donc allouer la mémoire pour les deux, puis utiliser par exemple la fonction strcpy :
strcpy(s,patro);

Voilà bon courage pour la suite
0
guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   53
 
Bon voilà j'ai fait quelques changement dans le main qui fontionne bien maintenant.

Seulement j'ai un problème avec ma fonction insérer, j'y ai mis:

int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1[20];

for(i=0;i<(strlen(s)-1);i++) //boucle de calcul de l'indice
{
temp=s[i]; //on met dans temp le caractere du i-ème patronyme
compteur=compteur +(temp-96); //emploi du code ascii pour calculer le hachage
}
while(n<5)
{
if(T[compteur%N]!=0) //recherche si on peut mettre le patronyme
{
temp=s[0];
compteur=compteur + 13*temp;//ajout de 13 fois la première valeur (re-hachage)
n++;
}
else
{
strcpy(s1,s);
*T[compteur%N]=*s1; L'ERREUR EST ICI
return 1;
}
}
return 0;
}

Mais j'ai toujours une erreur. Peux-tu encore m'aider, stp?
0
guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   53
 
J'ai trouvé l'erreur pour la fonction inserer.

Maintent sur rechercher je crois avoir un problème aussi:

int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i]) //il ne fait bien ce test
return 0;
else
return 1;
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
Ton test compare un pointeur sur une chaîne de caractères avec une chaîne de caractères donc ca ne marchera pas.
Soit ça va planter, soit ça va te comparer une adresse avec une valeur. Dans les deux cas, ce n'est pas ce que tu veux.
0