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 :

inserer un mot dans une table de hachage


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut inserer un mot dans une table de hachage
    bonjour j'ai un souci dans mon code,
    jai fait une fonction qui lit les mots à partir d'un texte , les stocker dans une table de hachage.
    voila la structure de la table de hachage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct L
    {
    	int freq;
    	char mot[50];
     
    	struct L *suivant;
    } Liste;
    là yaura une condition avant l'insertion du mot, on verifie s'il existe avavnt si c'est le cas on incremente la frequence du mot sinon on l'insere.
    voilà le bout du code de la fonction
    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
    void insere_th(Liste **TableHash, const char *mot)
    {
        TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
     
        	/* calcule le hash du mot */
    	unsigned int idx = hash_cle(mot);
    	Liste *p = (Liste *)malloc(sizeof(Liste));
     
    	/* recherche du mot */
    p = TableHash[idx];
     
    while(p !=NULL)
    	{
     
    		p->freq = 1; //incrementtaion de la frequence
    		strncpy(p->mot, mot, sizeof(p->mot));
    	}
     
    	free(TableHash);
     
    }
    aide svp ?
    merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Eh bien, pour ce genre de choses, tu dois rechercher le mot dans la liste chaînée correspondante...

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Eh bien, pour ce genre de choses, tu dois rechercher le mot dans la liste chaînée correspondante...
    merci Medinoc, tu peux stp m'eclaircir un peux plus
    merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Code C : 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
    Chainon const * TrouverDansListeNonTrieeC(char const * mot, Chainon const *pcPremier)
    {
    	Chainon const * pcCourant = pcPremier;
    	while(pcCourant != NULL)
    	{
    		if(strcmp(mot, pcCourant->mot) == 0)
    			return pcCourant;
    		pcCourant = pcCourant->pSuivant;
    	}
    	return NULL;
    }
    Chainon * TrouverDansListeNonTriee(char const * mot, Chainon *pPremier)
    {
    	Chainon const * pcTrouve = TrouverDansListeNonTrieeC(mot, pPremier);
    	Chainon * pTrouve = (Chainon *)pcTrouve; /*const_cast*/
    	return pTrouve;
    }

  5. #5
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    merci Médinoc, mais ca veut dire quoi chainon: c'est la cellule de la liste chainée?

  6. #6
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut erreur de segmentation dans l'initialisation de la table de hachage
    bonjour à tous,
    j'ai une focntion qui cree une table de hachage, afin de stocker les mots du texte la dedans,
    mais je suis surprise, que dans la fonction yavait une erreur de segmentation dans l'instruction :
    j'ai voulu l'initialiser mais apprement cest faux ma methode d'initialisation
    quelqu'un peut m'aider svp?
    merci
    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
    void insere_th(Liste **TableHash, const char *mot)
    {
        TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
     
        	/* calcule le hash du mot */
    	unsigned int idx = hash_cle(mot);
    	Liste *p = (Liste *)malloc(sizeof(Liste));
     
    	/* recherche du mot */
    p = TableHash[idx];
     
    while(p !=NULL)
    	{
     
    		p->freq = 1;
    		strncpy(p->mot, mot, sizeof(p->mot));
    	}
     
    	free(TableHash);
    	free(p);
     
    }

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ce code est incohérent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void insere_th(Liste **TableHash, const char *mot) 
    {
       TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
    ...
    	Liste *p = (Liste *)malloc(sizeof(Liste));
     
    	/* recherche du mot */
    p = TableHash[idx];

    La fonction définit un paramètre TableHash qui, on peut le supposer, sera initialisé au moment de l'appel de la fonction avec ce qui convient.
    La ligne TableHash = malloc(...) écrase cette valeur pour créer un tableau de pointeurs sur liste. Autrement dit, le paramètre TableHash de la fonction ne sert à rien.
    Ce tableau de pointeurs n'est pas initialisé, donc TableHash[idx] et donc p, contiennent ... n'importe quoi !
    Pas de quoi s'étonner que p->... envoie dans les décors

    Pourquoi faire un malloc et ranger son adresse dans p pour la ligne suivante consciencieusement écraser la valeur obtenue par TableHash[idx] ?

  8. #8
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par diogene Voir le message
    Ce code est incohérent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void insere_th(Liste **TableHash, const char *mot) 
    {
       TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
    ...
    	Liste *p = (Liste *)malloc(sizeof(Liste));
     
    	/* recherche du mot */
    p = TableHash[idx];

    La fonction définit un paramètre TableHash qui, on peut le supposer, sera initialisé au moment de l'appel de la fonction avec ce qui convient.
    La ligne TableHash = malloc(...) écrase cette valeur pour créer un tableau de pointeurs sur liste. Autrement dit, le paramètre TableHash de la fonction ne sert à rien.
    Ce tableau de pointeurs n'est pas initialisé, donc TableHash[idx] et donc p, contiennent ... n'importe quoi !
    Pas de quoi s'étonner que p->... envoie dans les décors

    Pourquoi faire un malloc et ranger son adresse dans p pour la ligne suivante consciencieusement écraser la valeur obtenue par TableHash[idx] ?
    merci diogene , tu peux m'eclaircir un peu plus car je suis debutante
    merci

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Pour info: On ne caste pas le retour de malloc() en C.

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est difficile, il y a trop de choses que j'ignore sur la conception de ton programme.

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par cyrine Voir le message
    merci diogene , tu peux m'eclaircir un peu plus car je suis debutante
    Bonjour,

    Si vraiment tu es débutante en C, voire en programmation, et que tu rencontres beaucoup de difficultés (ce qui semble être le cas vu le nombre important de questions de ta part), je ne suis pas certain que faire un programme de l'ampleur et de la difficulté de celui que tu es en train de réaliser soit une bonne chose.
    Tu vas probablement obtenir quelque chose qui marche plus ou moins (et probablement plutôt moins que plus) grâce à l'aide des différents contributeurs sans maîtriser les bases et sans vraiment comprendre ce que tu fais. Fatalement les programmes suivant se feront encore dans la "douleur" et, à la longue, tu vas probablement te décourager.

    Il serait à mon avis que tu laisses pour l'instant ce programme de côté et que tu reprennes les bases en relisant tes cours/livres/tutoriels et en faisant des exercices plus adaptés à ton niveau

  12. #12
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Ben je pense que pour l'initialisation de la table de hachage ca doit etre de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0; i < TAILLEHASH; ++i)
    	{
    		TableHash[i] = NULL;
    	}
    merci

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

Discussions similaires

  1. comment inserer un enregistrement dans une table?
    Par floran30 dans le forum VB 6 et antérieur
    Réponses: 74
    Dernier message: 16/06/2006, 19h56
  2. [MySQL] recherche un mot dans une table
    Par hubidev dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/03/2006, 20h06
  3. [MySQL]Inserer fichier pdf dans une table
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/11/2005, 16h08
  4. Inserer des données dans une table access SQL
    Par ouellet5 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2005, 21h11
  5. Inserer du html dans une table!!
    Par blueangel dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/08/2005, 15h15

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