[C] Liste chainée problème suivant.

Résolu/Fermé
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 - 2 mai 2008 à 17:37
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 - 3 mai 2008 à 09:39
Bonjour,

j'ai un problème avec mon compilateur qui me met des mesages d'erreurs sur les "suivant". Il me dit que "suivant" n'a pas été déclaré.
Voilà mon code :

typedef struct Message{
char SMS[tailleSMS+1];
char date[150];
char horloge[128];
Message *suivant;
}Message;

La fonction qui pose problème :

void InsertionDuMessage(Message **listeSMS,char *SMS,char *date, char *horloge)
{
int sortie=0;
Message *nouveau=(Message*)malloc(sizeof(M
essage));
strcpy(nouveau->SMS,SMS);
strcpy(nouveau->date,date);
strcpy(nouveau->horloge,horloge);
while(sortie==0)
{
if(strcmp(date,nouveau->date)<0)
listeSMS=listeSMS->suivant;
else
{
if(strcmp(date,nouveau->date)==0 && strcmp(horloge,nouveau->horloge)<0)
listeSMS=listeSMS->suivant;
else
{
nouveau->suivant=listeSMS->suivant; // une fois le jeton trouvé, on fait "passer" la liste chainee par notre jeton
listeSMS->suivant=nouveau;
sortie=1;
}
}
}
}
Pourtant j'ai bien déclaré un suivant avant ma fonction.
Voilà merci pour l'aide.

2 réponses

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
2 mai 2008 à 19:37
Re-bonjour ;-)

Il y a une petite chose qui n'a pas posé de problème chez moi mais je l'ai compilé avec les normes C++. Je ne suis pas sûr qu'en C ce soit valide. (je dirais après)

L'erreur principale sont les listeSMS->suivant

Message **listeSMS;

listeSMS est un double pointeur, il représente : un tableau de pointeurs (mais je ne vois pas sa taille) donc plus probablement l'adresse d'un pointeur pour qu'il soit modifiable par la fonction pour qu'elle puisse modifier éventuellement la tête de la liste.

Je pense donc à
(*listeSMS)->suivant;

Je ne suis pas le mieux placé pour voir exactement l'utilisation de la variable mais l'idée est là.

Pour le petit détail que je changerais. Je mettrais simplement un struct de plus dans la déclaration de la structure.

typedef struct Message{
   char SMS[tailleSMS+1];
   char date[150];
   char horloge[128];
   struct Message *suivant;     //   <- Déclaration récurssive
}Message;


Je pense qu'à ce stade le typedef n'est pas encore fait donc le type Message n'est pas déclaré. Par contre le type struct Message l'est.
Un compilateur C++ accepte l'utilisation du type directement après un simple struct MonType. Si ton compilateur est strictement C et que ça lui va c'est juste que je raconte des bêtises ^^".

Voilou,
M.
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
2 mai 2008 à 19:43
Après un petit essai, en demandant un C strict à mon compilateur il a rejeté le Message de la structure : type non défini. Il faut donc bien le "struct"

M.
0
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 32
3 mai 2008 à 09:39
re mahmha,

effetivement, il faut bien remettre le struct ainsi que les * devant listeSMS.

Merci du conseil encore une fois.
0