Problème fabrication liste chainée
Bonjour,
J'ai fait une fonction qui doit créer une liste chainé avec une chaine de caractère passé en paramètre. Chaque caractère de la chaine étant unique dans la liste, seul le nombre d'occurrence change lorsque 2 fois la même lettre est trouvé. Seulement lors de l'exécution le programme plante d'un coup (je suis sous windows). Voici le code des 2 fonctions:
Code:
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
| liste liste_caractere (const char *chaine)
{
liste l = NULL;
arbrepoids ap;
int n = 256;
char *tab = malloc(n * sizeof (char));
int nb_car_differents = 0;
int ind1_chaine = 0;
int ind2_chaine = 0, frequence = 0;
int i = 0;
/* Tant que l'on n'arrive pas a la fin de la chaine */
while (chaine[ind1_chaine] != '\0')
{
/* On calcul la frequence du caractere */
frequence = 0;
ind2_chaine = 0;
while (chaine[ind2_chaine] != '\0')
{
if (chaine[ind2_chaine] == chaine[ind1_chaine])
{
frequence++;
}
ind2_chaine++;
}
ap.element = feuille (chaine[ind1_chaine]);
ap.poids = frequence;
/* On verifie que l'element n'a pas deja ete ajoute a la liste */
for (i=0;i<=nb_car_differents;i++)
{
/* Si on ne l'a pas trouve */
if (i == nb_car_differents)
{
l = creer_liste (ap, l);
nb_car_differents++;
tab[i] = ap.element->data;
break;
}
/* Si on l'a trouve */
if (ap.element->data == tab[i])
{
break;
}
}
ind1_chaine++;
}
free (tab);
tab = NULL;
return l;
} |
Code:
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
| liste creation_liste (arbrepoids e, liste l)
{
/* Allocation memoire */
liste ma_liste = malloc (sizeof (ma_liste));
if (ma_liste)
{
liste ptr_l = l;
ma_liste->data = e;
ma_liste->suivant = NULL;
/* Cas de l'insertion dans une liste nulle */
if (l == NULL)
{
return ma_liste;
}
/* Cas de l'insertion en tete de liste */
if (ma_liste->data.poids < ptr_l->data.poids)
{
ma_liste->suivant = ptr_l;
return ma_liste;
}
/* Cas autres */
while (ptr_l->suivant != NULL && ptr_l->suivant->data.poids < ma_liste->data.poids)
{
ptr_l = ptr_l->suivant;
}
/* Insertion apres */
ma_liste->suivant = ptr_l->suivant;
ptr_l->suivant = ma_liste;
return l;
}
else
{
exit (0);
}
return NULL;
} |
Et les structures et les fonctions feuille et noeud qui vont avec:
Code:
1 2 3 4
| typedef struct {
arbre element;
int poids;
} arbrepoids; |
Code:
1 2 3 4
| typedef struct liste {
arbrepoids data;
struct liste *suivant;
} *liste; |
Merci à tout ceux qui pourront m'aider à trouver ce qui va pas :)