
Envoyé par
OlivierDotre
Bonjours, je désire créer une queue dont les valeurs sont des char*, mais j'ai quelque problème.
<...>
Voici les problèmes :
Pour l'insertion, les éléments se mettent bien dans la liste, mais quand je les imprime (vie view), le premier et bon mais les autres, chaque fois sont rogner chaque fois le dernier éléments, donc le problème pour moi vient de l'insertion,mais je ne trouve pas.
Autre souci, quand je veux insérer un élément au début, j'ai un du mal à trouver comment arrêter la boucle.
void Enqueue(Queue **f, char *value)
On va supposer qu'il s'agit de chaines de caractères. Il est donc nécessaire d'accepter les adresses des chaines invariantes :
void Enqueue(Queue **f, char const *value)
Pour pouvoir tester le code, j'ai ajouté ceci au début :
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct queue
{
/* donnees */
char *val;
/* chainage */
struct queue *next;
}
Queue; |
et cela à la fin (provisoire):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
int main (void)
{
Queue *f = NULL;
View (f);
Enqueue (&f, "Hello");
View (f);
Enqueue (&f, "Wild");
View (f);
Enqueue (&f, "World");
View (f);
Clear (&f);
View (f);
return 0;
} |
et j'ai modifié View en
1 2 3 4 5 6 7 8 9 10
|
void View (Queue * f)
{
while (f)
{
printf ("'%s' -> ", f->val);
f = f->next;
}
printf ("NIL\n");
} |
Pour le moment, ça donne :
1 2 3 4 5 6 7 8
|
NIL
'Hello' -> NIL
'Wild' -> 'Hello' -> NIL
'World' -> 'Wild' -> 'Hello' -> NIL
NIL
Press ENTER to continue. |
Ce qui semble correct, mais je n'ai pas encore analysé tout le code...
est illisible. Préférer :
est trop brutal et pas portable. (EXIT_FAILURE). Je recommande de tester la valeur afin de ne pas continier en cas d'echec. Idem avec tous les malloc()... Laisser la décision à la couche applicative.
element->val = malloc (sizeof (value) + 1);
Est horriblement faux. sizeof concerne un objet (ici, un pointeur). Rien à voir avec la taille de l'objet pointé (qui ne peut être déterminée ici). Ce qui nous intéresse, c'est la longueur de la chaine, soit strlen(). Pour simplifier, je recommande l'usage de strdup(), qui, bien que non standard C, est POSIX.1, donc très portable (et facile à reproduire).
Ceci devrait déjà résoudre les problèmes basiques :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
void Enqueue (Queue ** f, char const *value)
{
Queue *element = malloc (sizeof (Queue));
if (element != NULL)
{
element->val = strdup (value);
if (element->val != NULL)
{
element->next = *f;
(*f) = element;
}
else
{
free (element);
}
}
} |
Dans Clear(), il manque la libération de la donnée :
Je n'ai pas vérifié le reste. DeQueue(), notamment, me parait étrange. Pourquoi des allocations ?
Partager