Akhelios
Messages postés2Date d'inscriptionmercredi 29 décembre 2010StatutMembreDernière intervention29 décembre 2010
-
29 déc. 2010 à 14:59
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 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 ?
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 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?
Akhelios
Messages postés2Date d'inscriptionmercredi 29 décembre 2010StatutMembreDernière intervention29 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.