Fonction inserer dans une liste ordonnées+liste chainée

curieuse9informatique Messages postés 14 Date d'inscription mardi 5 janvier 2010 Statut Membre Dernière intervention 26 mars 2013 - 19 févr. 2011 à 17:52
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Derniè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:

1 réponse

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
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.

while((strcmp(p2->nom,nom)<0)&&(strcmp(nom,p3->nom)>0)){

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.
0
Rejoignez-nous