Table de hachage avec patronyme

Résolu
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011 - 4 déc. 2007 à 15:52
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011 - 5 déc. 2007 à 11:17
Bonjour,

Désolé, j'avais d'abord poster dans les discussions libres.

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

Je vous remercie d'avance.

L'important, c'est les trois points...

5 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 déc. 2007 à 09:57
J'ai refait complètement la fonction inseré pour te montrer la manière de faire:
Compare à ce que tu avais fait et essaye bien de comprendre comment ca marche.
Une fois que tu auras compris le cheminement, tu n'auras aucun mal à faire les autres fonctions.

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

int inserer(char *szNom)
{
    char *P;
    int Hash=0,n=0;

    P=szNom;        //P pointe sur szNom
    while(*P != '\0')
    {
        Hash+= *P - 96;
        P++;
    }
    do
    {
        if(T[Hash%N]==0)        //vide
        {
            T[Hash%N]=szNom;
            return 1;
        }
        else
        {
            Hash+=13*szNom[0];
            n++;
        }
    }
    while(n<5);        //5 tentatives
    return 0;
}

int main()
{
    char *s,patro[N];
    int i;
    int choix;

    T=(char**)malloc(sizeof(char*)*N);

    for(i=0; i<N; i++) /*initialisiation de T a 0*/
        T[i]=0;
  
    int Bool=1; //booleen

   
   

    while(Bool)
    {
        for(i=0; i<N; i++)
            printf("%s\n", T[i]);
        printf("\n");
       

        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=(char*)malloc(sizeof(char*)*(strlen(patro)+1));
            strcpy(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 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;
}

Mon site internet : http://pistol.petesampras.free.fr
3
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
4 déc. 2007 à 16:28
Salut
Il y a des erreurs de partout...
-scanf attend l'adresse de la variable parto
- char patro;  = => tu ne pourra stoker qu' un caractère dans ton patronime
-*s =patro;  faut faire un strcpy, mais je ne vois pas l'utilité de cette variable intermédiaire
-Pour copier en générale deux chaines de caractère il faut que tu utilises strcpy. Sinon tu copies uniquement les pointeurs. Les deux chaine pointerons sur la meme zone et si tu fais une modif à l'une, les deux variables seront modifiées.

Voila pour commencer, corrige toutes les erreurs et tient nous au courant si tu as besoin d'aide

A+
Mon site internet : http://pistol.petesampras.free.fr
0
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011
4 déc. 2007 à 16:51
J'ai corigé en mettant char patro[20] et le scanf ("%s",&patro)

*s=patro, c'est pour que s pointe sur patro pour pouvoir utiliser les fonctions inserer, supprimer... aprés.

Apparemment j'aurai encore des problèmes avec les fonctions inserer supprimer et rechercher.

Si tu pouvais encore m'aider, ce serait super.

PS:Pete était le meilleur.

L'important, c'est les trois points...
0
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011
4 déc. 2007 à 17:17
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;

}

}



L'important, c'est les trois points...
0

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

Posez votre question
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011
5 déc. 2007 à 11:17
Merci beaucoup, ça m'a débloqué.

Et encore merci...

L'important, c'est les trois points...
0
Rejoignez-nous