Using ADT interfaces

Reversing a list when you can't edit the class
class StrList {
   public:
      StrList();  
     ~StrList();  
      long getListSize();
      bool insertAtBack(string s);
      bool insertAtFront(string s);
      bool removeFromBack(string &s);
      bool removeFromFront(string &s);
   private:
      // who cares, we can't access it anyway ;-)
};

bool Reverse(StrList &L)
{
   // find out how many strings there are to move
   long size = L.getListSize();

   // move the strings from L to a temporary list,
   //    keeping the same order, but
   // returning false if an operation fails
   long i; string s; StrList tmp;
   for (i = 0; i < size; i++) {
       if (!L.removeFromFront(s)) return false
       else if (!tmp.insertAtBack(s)) return false;
   }

   // now put them back in L, but in reverse order,
   // again returning false if anything fails
   for (i = 0; i < size; i++) {
       if (!tmp.removeFromFront(s)) return false
       else if (!L.insertAtFront(s)) return false;
   }

   // everything appears to have worked
   return true;
} 

Reversing a queue when you can't edit the class
class Queue {
   public:
      Queue();
     ~Queue();
      bool enqueue(string s);
      bool dequeue(string &s);
      long getQsize();
   private:
      // who cares, we can't access it anyway ;-)
};

bool Reverse(Queue &Q) // recursive solution
{
   // if Q is empty we're done
   if (Q.getQsize() < 1) return true;

   // otherwise take out the front item,
   //    reverse the rest of the queue,
   // and put the front item at the back of
   //    the reversed queue
   // return false if anything fails
   string s;
   if (!Q.dequeue(s)) return false;
   if (!Reverse(Q)) return false;
   if (!Q.enqueue(s)) return false;

   // everything seems to have succeeded
   return true;
} 

// ALTERNATIVE you could instead do the following:
//    get the size of the queue,
//    allocate an array of that many strings,
//    dequeue everything into the array,
//    enqueue everything from the array in the opposite order
//    delete the array

Reversing a list when you can edit the data directly
struct Node {
   string info;
   Node *next, *prev;
};

bool Reverse(Node *front, Node *back)
{
   // if front and back are the same then the list is
   //    empty or a single element, either way the list is
   //    the same forward as backward)
   if (front == back) return true;

   // set up pointers to the two ends, and walk each 
   //    towards the middle, swapping values as you go
   Node *f = front;
   Node *b = back;
   do {
      // if f or b hit a null then something has gone wrong
      if ((f == NULL) || (b == NULL)) return false;

      // swap the values in f and b
      string s = f->info;
      f->info = b->info;
      b->info = s;

      // if f->next is b then we've reached the middle
      //    of an even-length list, so we can quit
      if (f->next == b) return true;
   } while (f != b);
   // drops out of the loop when f and b meet in the middle
   //   of an odd-length list
   return true;
} 

Removing an item from a queue when you can't edit the class
class Queue {
   public:
      Queue();
     ~Queue();
      bool enqueue(string s);
      bool dequeue(string &s);
      long getQsize();
   private:
      // who cares, we can't access it anyway ;-)
};

bool Remove(Queue &Q, string s) 
{
   // find out how many items are in the queue
   long size = Q.getSize();

   // keep track of whether or not you found the
   //    target string and whether or not all the
   //    dequeueing and enqueueing was successful
   bool found = false;
   bool success = true;

   // go through the entire queue once,
   //    dequeueing and then re-enqueueing 
   //    each item EXCEPT the target string
   for (long i = 0; i < size; i++) {
       string qs;
       if (Q.dequeue(qs)) {
          if (qs == s) {
             found = true;
          } else if (!Q.enqueue(qs)) {
                // an enqueue didn't work
                success = false;
             }
          }
       } else {
          // a dequeue didn't work
          success = false;
       }
   }
   // return true iff you found the target and
   //    everything else went smoothly
   if (success && found) return true;
   else return false;
} 

Command line arguments: just some practice

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
   for (int i = 0; i < argc; i++) {
       if (argv[i][0] == '-') {
          cout << argv[i] << endl;
       }
   }
}


File IO: just some practice

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
   // if they didn't supply a filename on the command line
   //    just tell them how to use the program correctly
   if (argc < 2) {
      cout << "Correct use is \"";
      cout << argv[0] << " filename" << endl;
      return 0;
   } 

   // try to open the file
   ifstream infile;
   infile.open(argv[1]);
   if (infile.fail()) {
      cout << "Unable to open file " << argv[1] << endl;
      return 0;
   }

   // initialize the data variables
   long numLines = 0;
   long maxLineLen = 0;
   long wspcChars = 0;
   long curLineLen = 0;

   // read the file one line at a time,
   //    reading each line one character at a time,
   // keep track of the number of whitespace characters seen,
   //    the number of lines seen (by counting '\n' chars),
   //    and the length of each line (remembering the longest)
   while (!infile.eof()) {
      char c;
      infile.get(c);
      if (!infile.eof()) {
         // if we have started a new line then bump up the line count
         if (curLineLen == 0) numLines++;

         // bump up the number of characters seen on the current line
         curLineLen++;

         // if the char is whitespace then bump up that count
         if (isspace(c)) wspcChars++;

         // each time we see an end of line we check the line length
         //    against the max seen so far, replace it if this is
         //    the biggest seen so far, and reset the line length
         if (c == '\n') {
            if (curLineLen > maxLineLen) {
               maxLineLen = curLineLen;
            }
            curLineLen = 0;
         }
      }
   }

   // close the file and display the results
   infile.close();
   cout << "File " << argv[1] << " contained " << wspcChars;
   cout << " whitespace characters, and " << numLines << " lines.\n";
   cout << "The longest line being " << maxLineLen << " characters\n";
   return 0;
}