Problème d'insertion dans une table de hachage

Résolu/Fermé
Nirolac Messages postés 11 Date d'inscription jeudi 28 juillet 2016 Statut Membre Dernière intervention 22 décembre 2016 - 21 déc. 2016 à 15:26
Nirolac Messages postés 11 Date d'inscription jeudi 28 juillet 2016 Statut Membre Dernière intervention 22 décembre 2016 - 22 déc. 2016 à 18:26
Bonjour à tous ayant un projet portant sur les tables de hachage je vous sollicite aujourd'hui suite à un problème, la consigne est de comparer des lignes entre elles et afficher leurs numéros lorsqu'elles sont identiques en face de la ligne (celle identique), j'ai donc crée quelques fonction dont celle de hachage, d'ajout j'ai aussi tapé une ligne qui me permettait de trouver la plus longue ligne (avec le plus de caractères) pour utiliser un malloc et ne pas dépasser, mais voilà ma liste possède toujours la même ligne dans chaque cellule crée et je ne comprend pas pourquoi une aide serai vraiment bienvenue svp,
voici mon code avec ma structure
typedef struct chash chash;
struct chash
{	
	int nb_ligne;
    int key;
    void *t;
    chash *next;
};

typedef struct hash hash;
struct hash
{
  chash *head;
  
};
hash *CreerListe(void){
  hash *liste = malloc(sizeof(*liste));
  return liste;
}

int hachage(char *chaine) {
    int i = 0;
    int nb = 0;
    while (chaine[i] != '\0') {
        nb += chaine[i];
        ++i;
    }
    nb = nb % 100;
    return nb;
}

bool add_list(hash *l, char *c){
  chash *cellule = malloc(sizeof(*cellule));
  if (cellule == NULL){
    return false;
  }
  cellule->t = c;
  cellule->key = hachage(c);
  //~ printf("%d", cellule->key);
  if (l->head == NULL) {
      l->head = cellule;
      
  }

  chash *x = l->head;
  while (x->next != NULL) {
    x = x->next;
  }
  x->next = cellule;
  cellule->next = NULL;
  return true;
}
void ligne(hash *list) {
    int a = 1;
    chash *x = list->head;
        while (x != NULL) {
            x->nb_ligne = a;
            ++a;
            x = x->next;
        
    }
}

void affiche(hash *l){
    chash *x = l->head;
    if (l->head == NULL) {
        return;
    }
    while (x->next != NULL) {
        printf("%s\n", (char*)(x->t));
        printf("%d\n", x->key);
        printf("%d\n\n", x->nb_ligne);
        x = x->next;
    }
    return;
}
long unsigned int taille_l(const char *c) {
    int line = 0;
    FILE *fichier = fopen(c,"r");
    line = fgetc(fichier);
    long unsigned int nombre = 0;
    long unsigned int nombre2 = 0;
    while (line != EOF ) {
        while (line != '\n') {
            ++nombre;
            line = fgetc(fichier);
        }
        if (nombre > nombre2) {
            nombre2 = nombre;
        }
        nombre = 0;
        line = fgetc(fichier);
    }
    return nombre2;
}


int main(int argc, char* argv[]){
        hash *list = CreerListe();
        int c;
        if (argc == 2) {
            printf("-fichier : %s ", argv[1]);
            printf("\n");
            FILE *f;
            f = fopen(argv[1],"r");
            if (f == NULL) {
                printf("-> erreur d'ouverture du fichier \n");
                return EXIT_FAILURE;
            }
            unsigned long int nb_ligne_malloc = taille_l(argv[1]);
            c = fgetc(f);
            int cpt = 0;
            char *tr = malloc(nb_ligne_malloc * sizeof(tr));
            while (c != EOF) {
                while (c != '\n') {
                    tr[cpt] = (char)c;
                    c = fgetc(f);
                    ++cpt;
                }
                add_list(list,tr);
                //~ tr = '\0';
                cpt = 0;
                c = fgetc(f);
            }
            ligne(list);
            affiche(list);
            fclose(f);
    }
    return EXIT_SUCCESS;
}

Je m'excuse de la longueur du code mais je ne comprend pas pourquoi ça ne marche pas,
je vous souhaite une agréable journée

4 réponses

Nirolac Messages postés 11 Date d'inscription jeudi 28 juillet 2016 Statut Membre Dernière intervention 22 décembre 2016
21 déc. 2016 à 15:31
Par exemple dans mon fichier j'ai :
"salut ca
va et toi
oui"
Le code me renvoie
"ouiet toi
13
1

ouiet toi
28
2"

Or j'ai trois lignes et je devrais récupérer 3 éléments de ma liste chainée mais la que 2
0
Nirolac Messages postés 11 Date d'inscription jeudi 28 juillet 2016 Statut Membre Dernière intervention 22 décembre 2016
21 déc. 2016 à 20:01
Eh bah c'est mort ici...
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 22/12/2016 à 14:39
Pendant ce temps là au siège de CodeS-SourceS:

- "Messieurs, l'heure est grave. Le prince Nirolac a posté une question et n'a pas reçu une réponse au bout 5h ! Vous imaginez, 5h !"
- "Mais, la norme est plus proche des 24h, surtout en période de fêtes..."
- "Comment ça ? Que voulez-vous dire ? Que ce seraient des humains derrière qui auraient un boulot, une famille, des hobbies, ou seraient en vacances ? Qu'ils répondraient bénévolement et sans contrepartie autre que le respect ? Je n'y crois pas, tout le monde sait que ce sont des robots esclaves et qu'ils sont censés répondre à la minute ou une question est posée !"
- "Je ne comprends pas ce qu'il s'est passé, nos sous-êtres n'ont pas répondu assez vite et maintenant le prince l'a faire savoir de manière irrespectueuse. Qu'allons-nous faire ?"
- "Fouettez-les bordel ! Comment osent-ils être en repos un soir de période festive ! Qu'ils se prosternent immédiatemment en espérant obtenir le pardon du grand Nirolac !"


Plus sérieusement, comme tu t'en doutes, on ne répondra pas à ta question. C'est ce que t'apporte impatience mal placée et mépris envers les bénévoles. Je clos ce sujet.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Nirolac Messages postés 11 Date d'inscription jeudi 28 juillet 2016 Statut Membre Dernière intervention 22 décembre 2016
22 déc. 2016 à 18:26
Euh en quoi j'ai eu du mépris pour qui que ce soit ? J'ai simplement constaté qu'il y avait beaucoup de post sans réponse d'où mon message après je m'excuse si mon ton était méprisant cela n'était pas mon intention
Bonne soirée
0
Rejoignez-nous