Insertion par tri sur une liste chainée

Signaler
Messages postés
2
Date d'inscription
mercredi 29 décembre 2010
Statut
Membre
Dernière intervention
29 décembre 2010
-
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
-
Salut tous,
Je voulais réaliser une fonction d'ajout par tri dans une liste chaînée, sauf que ça marche pas et je me demande pourquoi, bon voilà le code :
///type utilisé
typedef struct scellule {
    char * nom;
    int age;
    struct scellule * suiv;
} tcellule;

///type pointeur (tête...)
typedef tcellule  * pcellule;

pcellule tete=NULL;
void ajout_tri(char *ch, int x){
pcellule p, l;
l=(tcellule*)malloc(sizeof(tcellule));
l->nom=malloc(strlen(ch)+1);
//détermination de l'adresse après laquelle on doit insérer
for(p=tete;p!=NULL && strcmp(p->nom,ch)>0;p=p->suiv);
//inserer le nouveau element là où il faut
if(p==tete){
l->suiv=tete->suiv;
tete->suiv=l;}
if(p->suiv==NULL){
l->suiv=NULL;
p->suiv=l;}
if(p->suiv!=NULL && p!=tete){
l->suiv=p->suiv;
p->suiv=l;}
//remplir cet élément
strcpy(l->nom,ch);
l->age=x;
}

Y a-t-il surtout un problème avec la tete, allocations ?

3 réponses

Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
Yop!
Je vois plusieurs problèmes:
- ta boucle for est vide: en effet, il y a un point-virgule à la fin de l'instruction et pas d'accolades...
- si tete vaut NULL, ce qui est le cas pour le 1er passage, que fais-tu?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Messages postés
2
Date d'inscription
mercredi 29 décembre 2010
Statut
Membre
Dernière intervention
29 décembre 2010

Salut Buno,
Bon pour ma boucle for, elle n'est pas vide : elle enchaîne jusqu'à ce que la condition n'est plus vérifiée, c'est à dire qu'à la fin de cette boucle j'obtiens un p qui contient l'adresse du premier élément sur la liste où strcmp(p->nom,ch)<0 ou (le cas échéant) où l'on est sur la fin de la liste (p->suiv==NULL)...

Si tete est NULL, j'ai mis un morceau de code correspondant :
if(p==tete){
l->suiv=tete->suiv;
tete->suiv=l;}

là je pointe l'élément sur le suivant de la tete (chaînage) puis je remets la tete sur cette élément...
Donc je vois pas trop il est où le problème.
Merci de ton intervention quand même.
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
for(p=tete;p!=NULL && strcmp(p->nom,ch)>0;p=p->suiv);

Ton point-virgule "arrête" ta boucle for et tu n'as pas d'accolades.
Erreur de copier-coller?
Quel est le problème exactement?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo