Fonction inserer dans une liste ordonnées+liste chainée
curieuse9informatique
Messages postés14Date d'inscriptionmardi 5 janvier 2010StatutMembreDernière intervention26 mars 2013
-
19 févr. 2011 à 17:52
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 2013
-
19 févr. 2011 à 19:51
SVP est ce que vous pouvez m'aider:
je doit faire une fonction ajouterlisteordonnée qui permet d'ajouter un element dans une liste chainée ordonnée mais je sais pas ou se trouve le problème(le programme se plante lors de son execution)
/*
*
*inserer dans une liste ordonnée
*
*/
int insertionListeOrd(char *nom,int val){
Personne *p=(Personne *)malloc(sizeof(Personne));
if(p==NULL) return 0;
else{
strcpy(p->nom,nom);
p->val=val;
if(premier==NULL){
p->svt=NULL;
premier=p;
return 1;
}
else{
Personne *p2=premier;
Personne *p3=premier->svt;
while((strcmp(p2->nom,nom)<0)&&(strcmp(nom,p3->nom)>0)){
p2=p2->svt;
p3=p3->svt;
}
p->svt=p3;
p2->svt=p;
}
}
}
A voir également:
Fonction inserer dans une liste ordonnées+liste chainée
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 19 févr. 2011 à 19:51
Salut,
je sais pas ou se trouve le problème(le programme se plante lors de son execution)
En fait tu as plusieurs problèmes. Déjà, chez moi ça ne plante pas, mais cetet différence de comportement s'explique très bien. Pour citer les problèmes :
strcpy(p->nom,nom);
Attention ! La fonction strcpy est dangereuse, tu risques ici à tout moment un dépassement en mémoire qui peux conduire, en fonction du cas, à un segfault, une corruption des données, une exécution de code arbitraire ou tout autre problème de ce genre. Afin de sécuriser ça, il te faut utiliser strncpy afin de contrôler le nombre de caractère copiés. Attention, avec strncpy il faut s'assurer soi même que l'on a bien un caractère nul à la fin de la chaîne.
if(premier==NULL){
Les variables globales c'est très mauvais, là c'est un problème d'architecture du code.
Double problème ici :
- D'une part un problème au niveau de l'algorithme, ces tests comparatifs ne font pas le travail qui leur est demandé.
- Dans certains cas tu passes un pointeur nul à strcmp. Le comportement de strcmp en cas de passage d'un pointeur nul n'est pas défini, ce qui rend possible un segfault en fonction de l'implémentation de la bibliothèque standard (ceci est saans doute la cause de l'absence de plantage chez moi).
Afin de faire la comparaison entre tes deux éléments, tu devrais utiliser une focntion à part qui est capable de els comparer. Ainsi tu sépare les rôles et tu rend ton programme à la fois plus simple à comprendre et plus aisé à maintenir.
}
Attention, tu n'as mis de valeur de retour que dans tes blocs conditionnels. Même s'il n'y a aps de raison pour ne pas arriver sur un return, certains compilateurs déclencheront une erreur.