/**********************************************************************
 * Fib - setFibNumber
 * Inputs: n (int)
 * Calculates the n-th Fibonacci number 
 ***********************************************************************/
void Fib::setFibNumber(int n)
{
   if (n < 1)
   {
      cout << "Fibonacci subscript cannot be less than 1\n";
      return;
   }
    /*need to clear fibNumber. setFibNumber() may be called several times on an     object and you would have problems if you didn't erase all previous data*/
   fibNumber.clear();
   fibNumber.insert(1,0); // fibNumber will start as f1. f1 = 1;
   fibSubscript = n;
   
   if (n < 3) // can return here if n is 1 or 2. 
      return;
   
   DLList<int> f2;
   f2.insert(1,0); // fibNumber(aka f1) = 1 and f2 = 1. We are rdy to start.
   Node<int>* p1;// traversal pointers for DLList objects fibNumber(f1) and f2
   Node<int>* p2;
   int temp = 0; // used as f1's node value placeholder. 
   int carry = 0;

   for (int i = 0; i < n - 2; i++) //run n - 2 times. f1 and f2 done already
   {
      //reset pointers to respective beginnings of lists. reset carry to 0
      p1 = fibNumber.getFirstNode();
      p2 = f2.getFirstNode();
      carry = 0;
      //Add both lists. fibNumber becomes sum, f2 becomes what fibNumber was
      while (p1 != NULL) 
      {
         temp = p1->getData();
         p1->setData((p1->getData() + p2->getData() + carry) % 1000000000); 
         carry = (temp + p2->getData()) / 1000000000;
         p2->setData(temp);
         p1 = p1->getNext();
         p2 = p2->getNext();
      }
      if (carry == 1) // Account for carry on addition of final nodes.
      {
         fibNumber.insert(1, fibNumber.getNumItems());
         f2.insert(0, f2.getNumItems());
      }
   }      
}
/**********************************************************************
 * Fib::display() - Displays the Fibonacci number.
 ***********************************************************************/
void Fib::display()
{   
   if (fibSubscript == 0)
   {
      cout << "Use setFibNumber() to initialize object\n";
      return;
   }
   Node<int>* trav = fibNumber.getFirstNode();
   
   while (trav->getNext() != NULL) // traverse to the end of the list
      trav = trav->getNext();
   
   cout << trav->getData();//display most significant node without setw/setfill
   trav = trav->getPrevious();
   
   while (trav != NULL) //traverse list in reverse and display w/ setw/setfill
   {
      cout << setw(9) << setfill('0') << trav->getData();
      trav = trav->getPrevious();
   }
   
}