Problème d'insertion dans une table de hachage [Résolu/Fermé]

Messages postés
11
Date d'inscription
jeudi 28 juillet 2016
Dernière intervention
22 décembre 2016
- - Dernière réponse : Nirolac
Messages postés
11
Date d'inscription
jeudi 28 juillet 2016
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
Afficher la suite 

4 réponses

Messages postés
11
Date d'inscription
jeudi 28 juillet 2016
Dernière intervention
22 décembre 2016
0
Merci
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
Messages postés
11
Date d'inscription
jeudi 28 juillet 2016
Dernière intervention
22 décembre 2016
0
Merci
Eh bah c'est mort ici...
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
0
Merci
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
Messages postés
11
Date d'inscription
jeudi 28 juillet 2016
Dernière intervention
22 décembre 2016
0
Merci
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.