fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. static void hanoi();
  5.  
  6. typedef struct cont_r *cont;
  7. struct cont_r {
  8. int n;
  9. char a;
  10. char b;
  11. char c;
  12. struct cont_r *k;
  13. };
  14.  
  15. typedef enum enum_e { FALSE, TRUE} enum_t;
  16.  
  17. void (*pc)();
  18. int n;
  19. char a;
  20. char b;
  21. char c;
  22. cont k;
  23. enum_t done;
  24.  
  25. void apply_k(){
  26. cont tmp;
  27. if(k == NULL)
  28. done = TRUE;
  29. else {
  30. printf("%c ==> %c\n", k->a, k->c);
  31. n = k->n - 1;
  32. a = k->b;
  33. b = k->a;
  34. c = k->c;
  35. tmp = k;
  36. k = k->k;
  37. free(tmp);
  38. pc = hanoi;
  39. }
  40. }
  41.  
  42. cont make_k(int n, char a, char c, char b, cont k2){
  43. cont k3 = malloc(sizeof *k3);
  44. k3->n = n;
  45. k3->a = a;
  46. k3->b = b;
  47. k3->c = c;
  48. k3->k = k2;
  49. return k3;
  50. }
  51.  
  52. void hanoi(){
  53. char tmp;
  54. if(n == 0){
  55. pc = apply_k;
  56. }
  57. else {
  58. k = make_k(n, a, c, b, k);
  59. tmp = c;
  60. c = b;
  61. b = tmp;
  62. n = n - 1;
  63. pc = hanoi;
  64. }
  65. }
  66.  
  67. void trampoline(){
  68. while(!done){
  69. pc();
  70. }
  71. }
  72.  
  73. void init_hanoi(int n2, char a2, char b2, char c2){
  74. n = n2;
  75. a = a2;
  76. b = b2;
  77. c = c2;
  78. k = NULL;
  79. done = FALSE;
  80. pc = hanoi;
  81. trampoline();
  82. }
  83.  
  84. int main () {
  85. k = malloc(sizeof *k);
  86. init_hanoi(3,'A','B','C');
  87. free(k);
  88. return 0;
  89. }
Success #stdin #stdout 0s 1852KB
stdin
Standard input is empty
stdout
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C