fonctions des listes chaînées, et problème avec le main
Bonjours tous,
Alors ça fait deux jours que je sèche sur quelques points, je me suis dit qu'il est temps de demander de l'aide.
D'abord le code des fonctions :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
//-------------------------------------------
///définir la structure
//-------------------------------------------
typedef struct pile
{
int valeur;
struct pile *prec;
} pile ;
//-------------------------------------------
/// intitialiser la pile à NULL
//-------------------------------------------
pile *MaPile = NULL;
//------------------------------------------
///fonction d'ajout dans la liste chaînée
//-------------------------------------------
pile * add(pile ** p,int val) {
pile * n=malloc(sizeof(pile));
n->prec= *p;
*p=n;
n->valeur= val;
return *p;}
//--------------------------------------------
///fonction de parcours dans une liste chaînée
//--------------------------------------------
void parcours(pile **p){
do
{
int val= (*p)->valeur;
printf("%d\n",val);
*p=(*p)->prec;
}while(*p);
}
//----------------------------------------------
///fonction de suppression dans une listee chaînée
//----------------------------------------------
void efface(pile **p){
pile * n= *p;
*p=(*p)->prec;
//free(*p);
}
//----------------------------------------------
///fonction de recherche dans une liste chaînée
//----------------------------------------------
void search(pile **p, int val){
int b=0;
while(*p != NULL)
{
if((*p)->valeur==val)
{
b=1;
}
*p=(*p)->prec;
}
if(b==1) printf(" it's 1");
if(b==0) printf("it's 0");
} |
alors pour vérifier le bon fonctionnement de ces fonctions, j'ai fait plusieurs versions du "main":
1/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
int main()
{
add(&MaPile, 1);
add(&MaPile, 2);
add(&MaPile, 3);
//efface(&MaPile);
printf("-----------\n");
parcours(&MaPile);
printf("-----------\n");
return 0;
} |
Qui marche à merveille, l'ajout se fait, le parcours aussi, l'affichage le prouve.
2/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
int main()
{
add(&MaPile, 1);
add(&MaPile, 2);
add(&MaPile, 3);
efface(&MaPile);
printf("-----------\n");
parcours(&MaPile);
printf("-----------\n");
return 0;
} |
Un élément saute, la fonction effacer marche alors ! Super !
3/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int main()
{
add(&MaPile, 1);
add(&MaPile, 2);
add(&MaPile, 3);
//efface(&MaPile);
printf("-----------\n");
parcours(&MaPile);
printf("-----------\n");
search(&MaPile,1);
return 0;
} |
Search ne marche pas, elle retourne 0, si d'ailleurs j'aurais initialiser b=5, elle aurait retourné 5, le teste ne se fait donc pas, ce que je ne comprends pas...:aie:
4/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
int main()
{
add(&MaPile, 1);
add(&MaPile, 2);
add(&MaPile, 3);
printf("-----------\n");
parcours(&MaPile);
printf("-----------\n");
efface(&MaPile);
printf("\n-----------\n");
parcours(&MaPile);
return 0;
} |
Là je compte parcourir la liste (le programme affichera alors 3,2,1), effacer un élément (qui sera 3) et reparcourir (ce qui devrait afficher 2.1), mais à ma grande surprise l'exe coïnce et me renvoie un message erreur : "pile.exe a cessé de fonctionner" !!
Je précise que j'utilise Code::blocks, version 10.05.
En attendant vos suggestions et réponses, merci de lire !;)