Code:
#include <stdlib.h>
#include <stdio.h>
struct cell
{
int disc;
struct cell *next;
};
void cellInit1(struct cell* p,int d)
{
p->disc = d;
p->next = p;
}
void cellInit2(struct cell* p,int d, struct cell **n)
{
p->disc=d;
p->next=*n;
}
struct list{
struct cell *rear;
};
int empty(struct list* p) {
return p->rear == p->rear->next;
}
void pop(struct list* p,int *i)
{
struct cell *front;
*i = 0;
if( empty(p) ) return;
front = p->rear->next;
p->rear->next = front->next;
*i =front->disc;
free(front);
}
void push(struct list* p,int d) {
struct cell* temp = p->rear->next;
p->rear->next = malloc(sizeof(struct cell));
cellInit2(p->rear->next,d,&temp);
}
void listInit(struct list* p) {
p->rear = malloc(sizeof(struct cell));
cellInit1(p->rear,0);
}
void listKill(struct list* p){
int i;
while(!empty(p)) pop(p,&i);
}
struct list pegs[3];
typedef int (*oper)(int);
int decr(int a)
{
a--;
if(a<0)
a=2;
return a;
}
int incr(int a)
{
a = (a+1)%3;
return a;
}
int main(void)
{
int n;
int i;
oper incr_decr;
int curr=0;
int p1 = 1, p2 = 2;
int d0,d1,d2;
listInit(&pegs[0]);
listInit(&pegs[1]);
listInit(&pegs[2]);
printf("Enter Number Of Discs:");
scanf("%d",&n);
for( i = n; i > 0; i--)
push(&pegs[0],i);
incr_decr = n%2 ? decr : incr; //conditional statement
while(1)
{
pop(&pegs[curr],&d0);
printf("Disc %d From %d",d0,curr);
curr = incr_decr(curr);
push(&(*(&pegs[curr])),d0);
printf(" To %d\n",curr);
p1 = incr_decr(p1);
p2 = incr_decr(p2);
if(!empty(&pegs[p1]) && !empty(&pegs[p2]))
{
pop(&pegs[p1],&d1);
pop(&pegs[p2],&d2);
if(d1 < d2)
{
push(&pegs[p2],d2);
push(&pegs[p2],d1);
printf("Disc %d From %d To %d\n",d1,p1,p2);
}
else
{
push(&pegs[p1],d1);
push(&pegs[p1],d2);
printf("Disc %d From %d To %d\n",d2,p2,p1);
}
}
else
{
if(empty(&pegs[p1]) && empty(&pegs[p2]))
break;
if(empty(&pegs[p1]))
{
pop(&pegs[p2],&d2);
push(&pegs[p1],d2);
printf("Disc %d From %d To %d\n",d2,p2,p1);
}
else
{
pop(&pegs[p1],&d1);
push(&pegs[p2],d1);
printf("Disc %d From %d To %d\n",d1,p1,p2);
}
}
}
listKill(&pegs[0]);
listKill(&pegs[1]);
listKill(&pegs[2]);
return 0;
}