[C] insertion en fin de liste chainée

Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006 - 16 mars 2004 à 19:02
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006 - 16 mars 2004 à 22:15
Bonjour, j'ai à nouveau un ch'tit souci...

je cherche à insérer un nouveau maillon à la fin d'une liste chainée. Avec ce que je fais, je me fait envoyer péter par mon compilateur... mais je vois pas où est l'erreur... snif...

Merci à ceux qui pourront m'aider !!! :)


//	Structure
typedef struct liste *ptr_liste;

typedef struct liste
{
char mot[5];
char type;
ptr_liste *suivant;
}liste;

//	Permet de faire une insertion en fin de liste chainée.
ptr_liste insertion(char mot_regle[30][5], ptr_liste p, long nb_mot)
{
ptr_liste courant, nouv;
int i=0, j=0;

for (i=0; i<nb_mot; i++)
{

nouv = (ptr_liste) malloc (sizeof(liste));

for(j=0; j<5; j++)
{
nouv->mot[j] = mot_regle[i][j];
}

nouv->suivant = NULL;

if (p == NULL)
{
p = nouv;
}
else
{
courant = p;
do
{
courant = courant->suivant;
}while(courant != NULL);
courant = nouv;
}
}

return p;
}



Merci beaucoup !!! ;)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------

5 réponses

cs_goth Messages postés 82 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 23 août 2005
16 mars 2004 à 20:22
euh....je suis peut etre bete mais elle est censée faire koi ta fonction...

de plus je comprend pas pourquoi tu met ton malloc dans la boucle pour faire un nouveau maillon

puis dans : nouv->mot[j] = mot_regle[i][j];

nouv-> mot comme tu l'a defini est un chaine et mot_regle un tableau de chaine...et tu essaie d'affecter une chaine à un caractère(nouv->mot[j])...puis si c vraiment une copie de chaine que tu veux, n'oublie pas strcpy...

explique ce que t'a fonction est censé faire pcq la moi, je bloque...
0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
16 mars 2004 à 20:38
Pour être plus clair, je remets la source avec les commentaires.

Sinon, effectivement, j'aurais pu faire un strcpy... mais je me souvenais plus du nom de la fonction... ce ke g fait est la meme chose en plus long... c tout.

Sinon, le but véritable de ma fonction est d'insérer un nouveau maillon à la fin d'une liste chainée, et ce plusieurs fois (pour différents maillons). Je ne cherche pas de classement spécial, je veux juste les rentrer les uns à la suite des autres.

Voilà, j'espère que j'ai été plus clair et que ca va te permettre de m'aider !!!! :)


//	Permet de faire une insertion en fin de liste chainée.
ptr_liste insertion(char mot_regle[30][5], ptr_liste p, long nb_mot)
{
ptr_liste courant, nouv;
int i=0, j=0;

//	On fait une boucle pour insérer tous les mots d'une règle dans une liste chainée.
for (i=0; i<nb_mot; i++)
{
//	On prépare le nouveau maillon à insérer
nouv = (ptr_liste) malloc (sizeof(liste));

for(j=0; j<5; j++)
{
nouv->mot[j] = mot_regle[i][j];
}
nouv->suivant = NULL;

//	Si la chaine est vide, la tête de la liste sera le maillon nouv...
if (p == NULL)
{
p = nouv;
}
//	... sinon, on va à la fin de la liste chainée et on insert en dernier.
else
{
courant = p;
do
{
// Il semblerait que se soit là que ca coince :
courant = courant->suivant;
}while(courant != NULL);
courant = nouv;
}
}

return p;
}



Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 mars 2004 à 22:00
Tu n'as pas honte de faire ce genre de truc en C alors qu'un langage objet comme C++ est bien mieux adapté?
0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
16 mars 2004 à 22:12
Bah honte, en fait pas trop...

vu que ce que je fais répond à un sujet donné... et qu'une des conditions du sujet est que le projet soit fait en C.

De plus, pour l'instant je ne connais pas encore le C++... mais ca va pas tarder à arriver ;)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
16 mars 2004 à 22:15
Bon voilà la révision que j'ai apporté à la chose, mais je sais pas encore si ca va être accepté par le compilateur :question)

//	Permet de faire une insertion en fin de liste chainée pour
//	insérer tous les mots d'une règle dans une liste chainée.
void insertion(char mot_regle[30][5], ptr_liste *p, long nb_mot)
{
ptr_liste *courant, *nouv;
int i=0;

//	On fait une boucle pour insérer tous les mots d'une règle dans une liste chainée.
for (i=0; i<nb_mot; i++)
{
courant = (ptr_liste*) malloc (sizeof(liste));
//	On prépare le nouveau maillon à insérer
nouv = (ptr_liste*) malloc (sizeof(liste));

strcpy((*nouv)->mot, mot_regle[i]);
(*nouv)->suivant = NULL;

//	Si la chaine est vide, la tête de la liste sera le maillon nouv...
if (p == NULL)
{
p = nouv;
}
//	... sinon, on va à la fin de la liste chainée et on insert en dernier.
else
{
courant = p;
do
{
// Il semblerait que se soit là que ca coince :
courant = (*courant)->suivant;
}while(courant != NULL);
courant = nouv;
}
}
}


Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0
Rejoignez-nous