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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include<stdio.h>
#include<stdlib.h>
typedef struct Element Element;
struct Element
{
int nbr;
Element *suivant;
};
typedef struct Pile Pile;
struct Pile
{
Element *premier;
};
Pile *initialiser()
{
Pile *pile = malloc(sizeof(*pile));
pile->premier = NULL;
}
void empiler(Pile *pile,int nbr)
{
Element *nouveau = malloc(sizeof(*nouveau));
if(pile == NULL || nouveau == NULL)
{
printf("Un probleme s'est produit lors de l'appelle de la ft 'empiler'");
system("pause");
exit(EXIT_FAILURE);
}
nouveau->nbr = nbr;
nouveau->suivant = pile->premier;
pile->premier = nouveau;
}
void afficherPile(Pile *pile)
{
if (pile == NULL)
{
printf("Un probleme s'est produit lors de l'appelle de la ft 'afficherPile'");
system("pause");
exit(EXIT_FAILURE);
}
Element *actuel = pile->premier;
while (actuel != NULL)
{
printf("%d\n", actuel->nbr);
actuel = actuel->suivant;
}
printf("\n");
}
void hanoi(int n, Pile *depart, Pile *arivee, Pile *inter)
{
Element *elementDepile = depart->premier;
if(n != 0)
{
hanoi(n-1,depart,inter,arivee);
//Déplacer le disque de P1 vers P3
empiler(arivee, depart->premier->nbr);
depart->premier = depart->premier->suivant;
free(elementDepile);
hanoi(n-1,inter,arivee,depart);
}
}
int main()
{
/* création de 3 piles*/
Pile *p1 = initialiser();
Pile *p2 = initialiser();
Pile *p3 = initialiser();
empiler(p1, 1);
empiler(p1, 2);
empiler(p1, 3);
empiler(p1, 4);
empiler(p1, 5);
empiler(p1, 6);
printf("**Pile1** \n");
afficherPile(p1);
printf("**Pile3** \n");
afficherPile(p3);
hanoi(3,p1,p3,p2);
printf("**Pile1** \n");
afficherPile(p1);
printf("**Pile3** \n");
afficherPile(p3);
return 0;
} |
Partager