void CountryList::displayList() const
{
  ListNode *nodePtr;

  nodePtr = head->GetNextListNode();

  //Display the header
  cout << setfill('-');
  cout << setw(6) << "Code";
  cout << setw(20) << "Country";
  cout << setw(20) << "Capital";
  cout << setw(15) << "Population" << endl;
  for (int i = 0; i < 61; i++) { cout << '-'; }

  cout << endl << setfill(' ');
  while (nodePtr) {
    // Display the information in the current node.
    cout << setw(5) << nodePtr->GetCountry().GetCode() << " ";
    cout << setw(20) << nodePtr->GetCountry().GetName();
    cout << setw(20) << nodePtr->GetCountry().GetCapital();
    cout << setw(15) << nodePtr->GetCountry().GetPopulation() << endl;
    // Move to the next node.
    nodePtr = nodePtr->GetNextListNode();
  }
  cout << endl;
}
//**************************************************
// Searches the list for a given country code
//  - returns a pointer to the country if found
//  - returns NULL if the country cannot be found
//**************************************************
Country* CountryList::findCountry(const char* code) {
  ListNode *nodePtr;       // To traverse the list
  ListNode *previousNode;  // To point to the previous node

                           // If the list is empty, return NULL
  if (cnt == 0)
    return NULL;

  nodePtr = head->GetNextListNode();
  previousNode = head;

  while (nodePtr != NULL && strcmp(nodePtr->GetCountry().GetCode(), code)) {
    previousNode = nodePtr;
    nodePtr = nodePtr->GetNextListNode();
  }

  if (nodePtr) { // found
    return &nodePtr->GetCountry();
  }
  return NULL;
}
//**************************************************
// The insertNode function inserts a node with
// countryIn copied to its country member.
//**************************************************
void CountryList::insertNode(Country countryIn)
{
  ListNode *newNode;             // A new node
  ListNode *nodePtr;             // To traverse the list
  ListNode *previousNode = NULL; // The previous node

                                 // Allocate a new node and store the country there.
  newNode = new ListNode;
  newNode->SetCountry(countryIn);

  previousNode = head;
  nodePtr = head->GetNextListNode();
  // Find the location of the new node in the sorted list
  while (nodePtr != NULL && strcmp(nodePtr->GetCountry().GetCode(), countryIn.GetCode()) < 0) {
    previousNode = nodePtr;
    nodePtr = nodePtr->GetNextListNode();
  }
  // Update links and counter
  previousNode->SetNextListNode(newNode);
  newNode->SetNextListNode(nodePtr);
  cnt++;
}
//**************************************************
// The deleteNode function searches for a node
// with code as its code. The node, if found, is
// deleted from the list and from memory.
// It returns an error code
//      -1 represents an empty list
//      0 means the country was not found
//      1 means the country was deleted
//**************************************************
int CountryList::deleteNode(const char* code)
{
  ListNode *nodePtr;       // To traverse the list
  ListNode *previousNode = NULL;  // To point to the previous node

                           // check if list is empty
  if (cnt == 0)
    return -1; // -1 for empty list

  nodePtr = head->GetNextListNode();
  // Search for the node to be deleted from the list
  while (nodePtr != NULL && strcmp(nodePtr->GetCountry().GetCode(), code) != 0) {
    previousNode = nodePtr;
    nodePtr = nodePtr->GetNextListNode();
  }
  if (nodePtr) { // found
    previousNode->SetNextListNode(nodePtr->GetNextListNode());
    delete nodePtr;
    cnt--;
    return 1; // 1 for success
  }
  return 0; // 0 for not found
}