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 :

Hachage listes chainées


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Mai 2011
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 30
    Par défaut Hachage listes chainées
    Bonjour, soient les types suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct HASHELEMENT {
        char *chaine;
        int valeur;
        struct HASHELEMENT *suivant;
    } hashElement;
     
    typedef hashElement *hashList;
    Je cherche à faire la fonction void insert(hashList *liste, char *chaine, int valeur) qui insère la chaine et sa valeur en tête de la liste si elle ne s'y trouve pas déjà.

    Voici mon code qui ne marche pas :
    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
    void insert(hashList *liste, char *chaine, int valeur) {
        int i = 0;
        if (liste != NULL && chaine != NULL) {
            while (liste != NULL) {
                if (liste->chaine == chaine) {
                    i = 1;
                }
                liste = liste->suivant;
            }
            if (i == 0) { 
                hashList l = NULL;
                hashElement *e = chaine;
                l->chaine = e;
                l->suivant = liste;
                liste = l;     
            }  
        }
    }
    Pouvez vous m'aider ? Merci d'avance

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste->chaine == chaine
    Ici tu compares deux pointeurs et non les chaines de caractères. Il te faut utiliser strcmp(); pour la comparaison de texte.

    Une question un peu à côté. Tu emploies le HASH dans ta liste chaînée. Veux-tu faire une liste chaînée ou bien une table de hashage?

  3. #3
    Membre actif
    Inscrit en
    Mai 2011
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 30
    Par défaut
    Merci, j'ai essayé de corriger ma fonction, maintenant ça compile :
    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
    void insert(hashList *liste, char *chaine, int valeur) {
        int i = 0; 
        hashList l = *liste;
        while (l != NULL) {
            if (strcmp(l->chaine, chaine) == 1) {
                i = 1;
            }
            l = l->suivant;
        }
        if (i == 0) {
            hashElement e;
            e.chaine = chaine;
            e.valeur = valeur;
            e.suivant = *liste;
            *liste = &e;
        }
    }
    Mais lorsque je la teste en ajoutant des éléments, ça me fait une boucle infinie

    Je ne vois pas du tout d'où vient l'erreur..

    Pour répondre à ta question, pour l'instant il s'agit de faire une liste chainée, qui sera mise dans une table de hachage par la suite

  4. #4
    Expert confirmé
    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
    Par défaut
    Ceci est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if (i == 0) {
            hashElement e;
    ...
            *liste = &e;
        }
    Tu renvoies l'adresse d'une variable locale à la fonction (e) ce qui est toujours prohibé : la variable locale est détruite en sortie de fonction et son adresse devient illégale.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/07/2008, 20h14
  2. Table de hachage et liste chainée
    Par étoile de mer dans le forum Débuter
    Réponses: 1
    Dernier message: 28/05/2008, 14h50
  3. Réponses: 8
    Dernier message: 02/04/2004, 17h31
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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