Insertion par tri sur une liste chainée

Akhelios Messages postés 2 Date d'inscription mercredi 29 décembre 2010 Statut Membre Dernière intervention 29 décembre 2010 - 29 déc. 2010 à 14:59
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 29 déc. 2010 à 16:01
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

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
29 déc. 2010 à 15:16
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
0
Akhelios Messages postés 2 Date d'inscription mercredi 29 décembre 2010 Statut Membre Dernière intervention 29 décembre 2010
29 déc. 2010 à 15:59
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.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
29 déc. 2010 à 16:01
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
0
Rejoignez-nous