#include <iostream.h> 
template<typename T>class List;
template<typename T>class Node{
    T info;                                 
    Node<T> *link;                         
public:
    Node();                                  
    Node(const T & data);
    void InsertAfter(Node<T>* P);                 
    Node<T>* RemoveAfter();           
    friend class List<T>;
};
template <typename T> Node<T>::Node(){link=NULL;}
template <typename T> Node<T>::Node(const T & data){
    info=data;
    link=NULL;
}
template<typename T>void Node<T>::InsertAfter(Node<T>* p){
    p->link=link;
    link=p;
}
template<typename T>Node<T>* Node<T>::RemoveAfter(){
    Node<T>* tempP=link;
    if(link==NULL) tempP=NULL;                
    else link=tempP->link;
    return tempP;
}

template<typename T>class List{
    Node<T> *head,*tail;
public:
    List();             
    ~List();                                   
    void MakeEmpty();                              
    Node<T>* Find(T data);           
    int Length();                                
    void PrintList();                    
    void InsertFront(Node<T>* p);      
    void InsertRear(Node<T>* p);      
    void InsertOrder(Node<T> *p);  
    Node<T>*CreatNode(T data);             
    Node<T>*DeleteNode(Node<T>* p);       
};
template<typename T>List<T>::List(){
    head=tail=new Node<T>();
}
template<typename T>List<T>::~List(){
    MakeEmpty();
    delete head;
}
template<typename T>void List<T>::MakeEmpty(){
    Node<T> *tempP;
    while(head->link!=NULL){
        tempP=head->link;
        head->link=tempP->link;  //把头结点后的第一个节点从链中脱离
        delete tempP;            //删除(释放)脱离下来的结点
    }
    tail=head;  //表头指针与表尾指针均指向表头结点,表示空链
}
template<typename T> Node<T>* List<T>::Find(T data){
    Node<T> *tempP=head->link;
    while(tempP!=NULL&&tempP->info!=data) tempP=tempP->link;
    return tempP;        //搜索成功返回该结点地址,不成功返回NULL
}
template<typename T>int List<T>::Length(){
    Node<T>* tempP=head->link;
    int count=0;
    while(tempP!=NULL){
        tempP=tempP->link;
        count++;
    }
    return count;
}
template<typename T>void List<T>::PrintList(){
    Node<T>* tempP=head->link;
    while(tempP!=NULL){
        cout<<tempP->info<<'\t';
        tempP=tempP->link;
    }
    cout<<endl;
}
template<typename T>void List<T>::InsertFront(Node<T> *p){
    p->link=head->link;
    head->link=p;
    if(tail==head) tail=p;
}
template<typename T>void List<T>::InsertRear(Node<T> *p){
    p->link=tail->link;
    tail->link=p;
    tail=p;
}
template<typename T>void List<T>::InsertOrder(Node<T> *p){
    Node<T> *tempP=head->link,*tempQ=head;        //tempQ指向tempP前面的一个节点
    while(tempP!=NULL){
        if(p->info<tempP->info)break; //找第一个比插入结点大的结点,由tempP指向
        tempQ=tempP;
        tempP=tempP->link;
    }
    tempQ->InsertAfter(p);    //插在tempP指向结点之前,tempQ之后
    if(tail==tempQ) tail=tempQ->link;
}
template<typename T>Node<T>* List<T>::CreatNode(T data){//建立新节点
    Node<T>*tempP=new Node<T>(data);
    return tempP;
}
template<typename T>Node<T>* List<T>::DeleteNode(Node<T>* p){
    Node<T>* tempP=head;
    while(tempP->link!=NULL&&tempP->link!=p) tempP=tempP->link;
    if(tempP->link==tail) tail=tempP;
    return tempP->RemoveAfter();       //本函数所用方法可省一个工作指针,与InsertOrder比较
}

为单链表增加一个拷贝构造函数(深拷贝)

怎么写啊
[em18][em18]