題目: 寫C++程式碼說明如何複製一整個鏈結串列linked list到另一個變數。
答案: 寫C++程式碼說明如何複製一整個鏈結串列linked list到另一個變數。  串列是一個 header ，後面的 linked 一個個接後面，全部都是指標，所以並不能直接把 header 等於到另一個 header ，而是要把所有 linked 全部 new 一個新的，並加到目標的串鏈中。  這是在寫四則運算時用的stack ，這裡改成 queue 方式  Copy 的部份程式碼(完整程式碼在最後)：  // push  void Push( const Node & node )  {              Link *p ;              // 沒有              if( _header == NULL )              {                         _header = new Link( node , NULL );                         return ;              }              // 讀到最後一個              p = _header ;              while( p->Next() != NULL )                         p = p->Next();              // 新建              p->setNext( new Link( node , NULL ));  }  // 加入全部  void AddAll( const expQueue &src )  {              // 取來源的根              const Link *link = src._header ;              // 一個一個抓出來，並push 到自己裡面              while( link != NULL )              {                         // 加到串列中                         this->Push( *link );                         // 換到下一個 node                         link = link->Next();              }  }  // copy時，先把自己的移掉，再加入全部  void Copy( const expQueue &src )  {              RemoveAll();              AddAll( src );  }  // 用一個 class operator運算  void operator = ( const expQueue & src )  {              this->Copy( src );  }  #include <iostream>  using namespace std;  // ----------------------------------------------------------------  // Node 節點資料  class Node  {  private :  string _string ; // 字串  char _op ; // 運算子  int _value ; // 值  public:  // 建構  Node( const std::string& string , char op , int value )  {              _string = string;              _op = op ;              _value = value ;  }  // 取 op  char OP()const  {              return _op ;  }  // 取 值  int Value() const  {              return _value ;  }  // 印出  void Print() const  {              cout << _string ;  }  };  // ----------------------------------------------------------------  // Link 串列  class Link  {  private :  Node _node ; // 實體資料  Link *_next ; // 下一個的串  public :  // 建構  Link( const Node& node , Link * next )                         : _node(node), _next(next)  {  }  // 取得節點  operator Node () const { return _node; }  // 取下一個  Link * Next()  {              return _next;  }  const Link * Next()const  {              return _next;  }  // 印出  void Print() const  {              _node.Print();  }  // 設定下一個  void setNext( Link * pLink )  {              _next = pLink;  }  };  // ----------------------------------------------------------------  // stack  class expQueue  {  private :  // 資料串  Link *_header ;  public :  // 建構子  expQueue()  {              _header = NULL ;  }  // 解構子，移掉全部即可  ~expQueue()  {              RemoveAll();  }  // 移除全部  void RemoveAll()  {              Link *link = _header ;              Link *next ;              while( link != NULL )              {                         next = link->Next();                         delete link ;                         link = next ;              }              _header = NULL ;  }  // 是否是空的  bool isEmpty() const{ return _header == NULL ; }  // push  void Push( const Node & node )  {              Link *p ;              // 沒有              if( _header == NULL )              {                         _header = new Link( node , NULL );                         return ;              }              // 讀到最後一個              p = _header ;              while( p->Next() != NULL )                         p = p->Next();              // 新建              p->setNext( new Link( node , NULL ));  }  // pop  Node Pop()  {              Node ret = *_header ;              Link *nowLink = _header->Next() ;              delete _header ;              _header = nowLink ;              return ret ;  }  // 查看目前的資料  Node Peek()  {              return *_header ;  }  // push 一個數值  void PushValue( int value )  {              char ch[1024] ;              sprintf( ch ,  %d , value );              Node node( ch , 0 , value );              Push( node );  }  // push 一個 op  void PushOP( char op )  {              char ch[4] = { op , 0 } ;              Node node( ch , op , 0 );              Push( node );  }  // pop 一個 op  char PopOP()  {              Node ret = Pop();              return ret.OP();  }  // 印 stack 串  void Print() const  {              int i = 0 ;              Link *node = _header ;  // loop 到沒有節點為止              while( node != 0 )              {                         if( i > 0 )                                   cout <<   ,  ;                         node->Print();                         ++i ;                         node = node->Next();              }              cout << endl ;  }  // 加入全部  void AddAll( const expQueue &src )  {              // 取來源的根              const Link *link = src._header ;              // 一個一個抓出來，並push 到自己裡面              while( link != NULL )              {                         this->Push( *link );                         link = link->Next();              }  }  // copy時，先把自己的移掉，再加入全部  void Copy( const expQueue &src )  {              RemoveAll();              AddAll( src );  }  // 用一個 class operator運算  void operator = ( const expQueue & src )  {              this->Copy( src );  }  };  int main()  {  int i ;  expQueue a , b ;  // 測試  // 隨機加入 10 個數  for( i = 0 ; i < 10 ; ++i )              a.PushValue( rand()%1000);  cout <<  a array value:   ;  a.Print();  cout << endl ;  //  cout <<  copy to b array  << endl ;  b = a ;  // 也可以  // b.Copy( a );  cout <<  b array value:   ;  b.Print();  cout << endl ;  return 0;  }
評論: 搶答未必需要完整的程式碼，重點在於表達正確、清楚且完整。  例如：p->Next() 是什麼意思？可以執行嗎？