Bonjour,

Je souhaite stocker des mots dans une structure grâce à un tableau de liste.
Pour cela je crée une structure et un tableau. Je crée une fonction hashcode, qui va coder les mots pour ensuite les placés dans le tableau et liste. Seulement j'ai un problème avec la fonction ajouter élément.(normalement supprimer élément, afficher résultat,hashcode sont des fonction qui marchent).

Pour la fonction Ajouter élément j'ai un problème de segmentation. Je sollicite votre aide pour connaitre les erreurs au sein de mon code. Je commence à apprendre le C depuis 3 semaines donc je connais pas bien toutes les petites astuce. (je suis sur ubuntu, je compile avec gcc).

Assez bavardé voici mon code, en espérant que vous pourrez y faire quelque chose.
Merci d'avance.
Cordialement,
Frip.

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TAILLE 7
 
// On définie d'abord la structure de l'enregistrement
/*On a donc un tableau pointant vers un élement de type strucure [tab[i]]--->[chaine|nb|suiv]*/
 
struct Boite {
  char* chaine;        //case qui enregistre le mot que l'on souhaite manipuler
  int nb;	            //Va compter le nombre d'occurence du mot
  struct Boite *suiv; //pointeur qui pointe vers la structure suivante
};
 
typedef struct Boite Element;
Element *tab[TAILLE]; 				
 
 
// On va maintenant initialiser toute la structure
void initialisation(){
  int i;
  for (i=0;i<TAILLE;i++){
    tab[i]=NULL;
  }
}
 
 
/*Fonction hashcode ( fonction qui va hasher les mots en codes pour ensuite donner un numéro entre 1 et TAILLE du tableau)*/
 
int hashcode(char mot[]){
  int resultat=0;
  int code;
  int nb=0;
  int i=0;
  while ( mot[i] != '\0'){
    resultat=mot[i]+nb;
    nb=resultat;
    i++;
  }
  code=resultat%TAILLE;
  printf("code : %i\n\n",code);
  return code;
}
 
//Fonction affRésult, qui va afficher les valeurs dans la structure
 
void affResult(){
  int i;
  for (i=0;i<TAILLE;i++){
    printf("clé n° %d\n",i);
    Element *temp=tab[i];
    while (temp != NULL){
      printf("%s(%d)",temp->chaine, temp->nb);
      temp=temp->suiv;
    }
  printf("\n");
  }
}
 
/*
//Fonction ajout element dans la structure V.1 qui ne marche pas
void ajoutElmt(Element *elmt){
  int place=hashcode(elmt->chaine);
  if (tab[place]==NULL){
    tab[place]=elmt;
  }
  else{
    Element *temp=tab[place];
    int exist=strcmp(temp->chaine,elmt->chaine);
  
    while (temp->suiv != NULL && exist !=0){
      temp=temp->suiv;
      exist=strcmp(temp->chaine, elmt->chaine);
    }
  
    if (exist==0){
      temp->nb+=1;
    }
    else{
      Element *nouv;
      nouv=(Element*)malloc(sizeof(struct Boite));
      nouv->chaine=elmt->chaine;
      nouv->nb+=1;
      nouv->suiv=NULL;
      temp->suiv=nouv;
    }
  }
}
*/
 
//Fonction ajout element dans la structure V.2 qui ne marche pas
 
void ajoutElmt(Element *elmt,char mot[]){
  strcpy(elmt->chaine,mot);
  int place=hashcode(elmt->chaine);
  if (tab[place]==NULL){
    tab[place]=elmt;
  }
  else{
    Element *temp=tab[place];
    int exist=strcmp(temp->chaine,elmt->chaine);
 
    while (temp->suiv != NULL && exist !=0){
      temp=temp->suiv;
      exist=strcmp(temp->chaine, elmt->chaine);
    }
 
    if (exist==0){
      temp->nb+=1;
    }
    else{
      Element *nouv;
      nouv=(Element*)malloc(sizeof(struct Boite));
      nouv->chaine=elmt->chaine;
      nouv->nb+=1;
      nouv->suiv=NULL;
      temp->suiv=nouv;
    }
  }
}
 
 
 
 
 
 
//Fonction supprimer un élément
 
void supElmt(char *chaine){
  Element *tete=tab[hashcode(chaine)];
  if (tete==NULL){
    printf("la liste est vide");
  }
  else{
    Element *temp=NULL;
    Element *courant=tete;
    while (courant != NULL && strcmp (courant->chaine,chaine) != 0){
      temp=courant;
      courant=courant->suiv;
    }
 
      if (temp->suiv==NULL){
	printf("élement non trouvé");
      }
      else{
	Element *asupprimer=temp->suiv;
	temp->suiv=temp->suiv->suiv;
	free(asupprimer);
      }
   }
}
 
 
int main(){
 
 
  Element *elmt;
  char mot="mot";
  ajoutElmt(elmt,mot);
  affResult();
 
}