#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct bList{
   bList *left;
   int num;
   bList *right;
};
void header(bList **);
void enter(bList **list);
void makeList(bList **list, int number);
void add(bList **list1, bList **list2, bList **list3);
void print(bList **);
int main()
{
   bList *list1, *list2, *list3;
   //create header node for two list
   clrscr();
   header(&list1);
   header(&list2);
   printf("Enter first number(-1) to END:\n");
   enter(&list1);
   printf("Enter second number(-1) to END:\n");
   enter(&list2);
   header(&list3);
   add(&list1, &list2, &list3);
   print(&list3);
   getch();
   return 0;
}
//******************
void header(bList **list)
{
   (*list) = (bList *)malloc(sizeof(struct bList));
   (*list) -> left = (*list) -> right = *list;
   (*list) -> num = 0;
}
//*************
void enter(bList **list)
{
   int number;
   while(1)
   {
      printf("One block(3 digit):");
      scanf("%d", &number);
      if(number > 999)
      {
  printf("Block is illegal. Enter agin.");
  getch();
      }
      else if(number == -1)
  break;
      else
  makeList(list, number);
   }
}
//******************
void makeList(bList **list, int number)
{
  (*list) -> num ++;
  bList *help;
  help = (bList *)malloc(sizeof(struct bList));
  help -> num = number;
  help -> left = (*list) -> left;
  (*list) -> left -> right = help;
  (*list) -> left = help;
  help -> right = (*list);
}
//******************
void add(bList **list1, bList **list2, bList **list3)
{
   int num1, num2, temp, result, carry = 0;
   bList *h1, *h2;
   h1 = (*list1) -> left;
   h2 = (*list2) -> left;
   while(h1 != (*list1) && h2 != (*list2))
   {
       num1 = h1 -> num;
       num2 = h2 -> num;
       temp = num1 + num2 + carry;
       result = temp % 1000;
       carry = temp / 1000;
       makeList(list3, result);
       h1 = h1 -> left;
       h2 = h2 -> left;
   }
   while(h2 != (*list2))
   {  //if list2 not finished
       num2 = h2 -> num;
       temp = num2 + carry;
       result = temp % 1000;
       carry = temp / 1000;
       makeList(list3, result);
       h2 = h2 -> left;
   }
   while(h1 != (*list1))
   {  //if list1 not finished
       num1 = h1 -> num;
       temp = num1 + carry;
       result = temp % 1000;
       carry = temp / 1000;
       makeList(list3, result);
       h2 = h2 -> left;
   }
   if(carry != 0)
       makeList(list3, carry);
}
//******************
void print(bList **list)
{
   bList *h;
   printf("Sum of two numbers is :");
   h = (*list) -> left;
   while(h != *list)
   {
     if(h -> num < 10)
       printf("%d%d%d ",0,0, h -> num);
     else if(h -> num >= 10  && h -> num < 100)
   printf("%d%d ",0, h -> num);
     else
   printf("%d ", h -> num);
     h = h -> left;
   }
}