If anyone can explain why this code doesn't work:

Code:
#include <iostream.h>

//******************************* Node class *********************************************

   class Node{
      char data;
      Node *next;
   public:
      Node() : data(0), next(0){}
      Node(char e) : data(e), next(0){}
      friend class myString;
      friend ostream& operator << (ostream& os, const Node& x);
      friend ostream& operator << (ostream& os, const myString& str);
   };

   ostream& operator << (ostream& os, const Node& x){
      os << x.data;
      return os;}

   //******************************** myString prototypes ******************************************

   class myString{   
      Node *head;      
   public: 
      myString();
      int addRear(char ch);
      friend ostream& operator << (ostream& os, const myString& str);
      friend istream& operator >> (istream& is, myString& str);
   };

//*********************************** myString Functions ***********************************

   myString :: myString() : head(0) {}

   int myString :: addRear(char ch){
      if (! head) { // adding to empty list
         head = new Node(ch);
         return 1;}
      Node *temp = head;
      while (temp -> next) // find end of list
         temp = temp -> next;
      Node *newone = new Node(ch);
      temp -> next = newone;
      return 1;}

   ostream& operator << (ostream& os, const myString& str) {
      Node *temp = str.head;
      while (temp) {
         os << *temp;
         temp = temp -> next;}
      delete temp;
      return os;}

   istream& operator >> (istream& is, myString& str){
      char ch;
      while(ch != '\n' && ch != ' '){
         cin.get(ch);
         if(ch != '\n' && ch != ' ')
            str.addRear(ch);}
      return is;}

//*********************************** MAIN *******************************************************

   void main (void){
   
      myString a , b;
      int op;
      cin >> op;
   
      switch(op){
         case 1:
            cin >> a;
            cout << a;
            break;
         case 2:
            cin >> b;
            cout << b;
            break;
      }
   }
And why this code works for case 1 but not case 2:

Code:
#include <iostream.h>

//******************************* Node class *********************************************

   class Node{
      char data;
      Node *next;
   public:
      Node() : data(0), next(0){}
      Node(char e) : data(e), next(0){}
      friend class myString;
      friend ostream& operator << (ostream& os, const Node& x);
      friend ostream& operator << (ostream& os, const myString& str);
   };

   ostream& operator << (ostream& os, const Node& x){
      os << x.data;
      return os;}

   //******************************** myString prototypes ******************************************

   class myString{   
      Node *head;      
   public: 
      myString();
      int addRear(char ch);
      friend ostream& operator << (ostream& os, const myString& str);
      friend istream& operator >> (istream& is, myString& str);
   };

//*********************************** myString Functions ***********************************

   myString :: myString() : head(0) {}

   int myString :: addRear(char ch){
      if (! head) { // adding to empty list
         head = new Node(ch);
         return 1;}
      Node *temp = head;
      while (temp -> next) // find end of list
         temp = temp -> next;
      Node *newone = new Node(ch);
      temp -> next = newone;
      return 1;}

   ostream& operator << (ostream& os, const myString& str) {
      Node *temp = str.head;
      while (temp) {
         os << *temp;
         temp = temp -> next;}
      delete temp;
      return os;}

   istream& operator >> (istream& is, myString& str){
      char ch;
      while(ch != '\n' && ch != ' '){
         cin.get(ch);
         if(ch != '\n' && ch != ' ')
            str.addRear(ch);}
      return is;}

//*********************************** MAIN *******************************************************

   void main (void){
   
      myString a , b;
      int op;
      cin >> op;
   
      switch(op){
         case 1:
            cin >> a;
            cout << a;
         case 2:
            cin >> b;
            cout << b;
      }
   }
If you can explain this, I will give you $0.01 U.S. currency.

(Hint: The last code doesn't use 'break' in the switch/case statement.)