我用C++中的模板写了实现链表的一些基本功能,刚开始用这该死的模板,当进行运行的时候却发现不能够打印出具有头节点的链表值。void Browse (ListNode<T>*h) ;//打印链
表 这个成员函数好像没有被调用,这到底是怎么回事?源程序如下:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
#include <iostream.h>template <class T> class List;template <class T> class ListNode 
{
friend class List<T>;
public:
       ListNode ( );  //构造函数
       ListNode ( const T& item ); //构造函数
       ListNode<T>* NextNode(){return link};     //给出当前节点的下一个地址
       void InsertAfter(ListNode<T>* p);           //当前节点插入
       ListNode<T>* GetNode(const T& item,ListNode<T>* next);//建立一个节点
       ListNode<T>* RemoveAfter();            //删除当前节点的下一个节点
private:
       T data;
       ListNode<T> *link;
};template <class T> class List 
{
public:
   
      List();  //构造函数,建立一个空链表
      List ( const T finished,ListNode<T> **h  ); //建立链表
      void Browse (ListNode<T>*h) ; //打印链表
      void Merge (ListNode<T>*ha, ListNode<T> *hb ,ListNode<T>**hc);
           //连接链表
~List();                                    //析构函数
        void MakeEmpty();                           //将链表置空
        int Length() const;                         //计算链表长度
        ListNode<T>* Find(T value);                 //在链表中找出数据为value的节点
        ListNode<T>* Find(int i);                  //搜索链表中第i个元素的地址
        int Insert(T value,int i);                  //将新元素插到链表中第i个位置
        T * Remove(int i);                          //删除第i个位置的元素
        T * Get(int i);                             //得到第i个位置的元素
private:
ListNode<T> *first, *last;
};//各成员函数的实现
template <class T>
ListNode<T> :: ListNode ( ) : link ( NULL ) { }
//构造函数, 仅初始化指针成员。template <class T> ListNode<T> :: ListNode ( const T & item ) : data ( item ), link ( NULL ) { }
//构造函数, 初始化数据与指针成员。template<class T> void ListNode<T>::InsertAfter(ListNode<T> *p)
{  //将p所指示的节点链接成当前节点下一个节点
   p->link=link;
   link=p;
}template<class T> ListNode<T>* ListNode<T>::GetNode(const T& item,ListNode<T> *next=NULL)
{   //建立一个新节点,返回新节点的地址
   ListNode<T> *newnode= new ListNode<T>(item,next);
   return newnode;
}template<class T> ListNode<T>* ListNode<T>::RemoveAfter()
{  //从链中摘下当前节点的下一个节点,并为删除他而返回其地址
   ListNode<T>* tempptr=link;
   if(link == NULL) return NULL;
   link = tempptr->link;
   return tempptr;
}template <class T> List<T> :: List ( ) 
{
first=last=NULL;
}template <class T> List<T> :: List ( const T finished,ListNode<T> **h ) 
{
//创建一个带表头结点的单链表, finished是停止建表输入标志, 是所有输入值中不可能出现的数值。
*h =first= last = new ListNode<T>( );   //创建表头结点
T value;
ListNode<T> *p,*q; cout<<"Please Enter The Value:"<<endl;
cin >> value;
p = *h;  while ( value != finished )
{ //循环建立各个结点
q= new ListNode<T>();
q->data=value; 
p->link=q;
p=q;
cin >> value;
}
p->link=NULL;
last=p;
first=*h;
}template<class T>void List<T>::MakeEmpty()
{  //将链表置为空
   ListNode<T> *q;
   while(first->link!=NULL)
   {
      q=first->link;
      first->link=q->link;
      delete q;
    }
    last = first;//表尾指针指向表头指针
}template<class T> List<T>::~List()
{//析构函数
   MakeEmpty();
   delete first;
   first = last = NULL;
}template<class T> int List<T>::Length() const
{//计算带头节点的单链表的长度
   ListNode<T> *p= first->link;
   int count = 0;
   while(p! = NULL)
   {
     p=p->link;
     count++;
   }
   return count;
}template<class T> ListNode<T>* List<T>::Find(T value)
{//在单链表中寻找值为value的节点,如果找到,则返回他的地址,否则返回NULL
   ListNode<T> *p=first->link;
   while(p!= NULL && p->data!=value)
     p=p->link;
   return p;
}template<class T> ListNode<T>* List<T>::Find(int i)
{//定位函数。返回链表中第i个元素的地址,如果i<-1或i超出链表长度,则返回NULL
 
   if(i<-1 ) return NULL;
   if(i==-1)return first;
   ListNode<T>* p=first->link;
   int j=0;
   while(p!=NULL && j<i)
   {
      p=p->link;
      j++;
   }
   if(j=i)
   return p;
   else
       return NULL;
}template<class T> int List<T>::Insert(T value,int i)
{//将新元素value插在链表中第i个位置
   ListNode<T>* p=Find(i-1);
   if(p== NULL) return 0;
   ListNode<T>* newnode = GetNode(value,p->link);
   if(p->link ==NULL) last = newnode;
   p->link = newnode;
   return 1;
}template<class T>T* List<T>::Remove(int i)
{//将链表中第i个元素删除,并返回该元素值。若i不合理,则返回NULL
   ListNode<T>* p=Find(i-1),*q;
   if(p== NULL || p->link ==NULL) return NULL;
   q= p->link;
   p-link=q->link;
   T value =q->data;
   if(q== last)
     last=p;
   delete q;
   return &value;
}/*template<class T>T* List<T>::Get(int i)
{//取出链表中第i个元素,返回他的地址
   ListNode<T>* p = Find(i);
   if(p== NULL || p==first)
   return NULL;
   else
     return  & p->data;
}
  */ 
template <class Type> void List<Type> :: Browse ( LinkNode<T>* h)
 {
        //浏览并输出链表的内容
cout<<"\nThe List is : \n";
ListNode<Type> *p = h->link;
    while ( p != NULL )
{
cout << p->data;
if ( p != last ) cout << "->";
else cout << endl;
p = p->link;
}
}
template <class T> void List <T> :: Merge ( ListNode<T>*ha,ListNode<T>* hb,ListNode<T>**hc)
 {
//将当前链表this与链表hb按逆序合并,结果放在链表*hc中。 
ListNode<T> *pa, *pb, *q, *p; 
pa = ha->link;  pb = hb->link;            //检测指针跳过表头结点
    *hc=new ListNode<T>();             //结果链表初始化
q=*hc=NULL;
    while ( pa != NULL && pb != NULL )
{ //当两链表都未结束时 
q->link=new ListNode<T>();
q=q->link;
if ( pa->data <= pb->data )
{   
    q->data = pa->data;  
pa = pa->link;
} //从pa链中摘下
        else

q->data = pb->data; 
pb = pb->link; 
} //从pb链中摘下
        

p = ( pa != NULL ) ? pa : pb; //处理未完链的剩余部分
while ( p != NULL ) 
{  
q->link=new ListNode<T>();
q=q->link;
q->data = p->data; 
p = p->link; 
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "ListTemplate.h"
#include <iostream.h>void main()
{ List<char> CharList;
const char finished='!';
    ListNode<char> *ha,*hb,*hc;
ha= new ListNode<char> ();
hb= new ListNode<char> ();
hc= new ListNode<char> ();
    List<char>('!',&ha);
CharList.Browse (ha) ;
    List<char>('!',&hb);
CharList.Browse (hb);
CharList.Merge (ha,hb,&hc);
CharList.Browse (hc) ;

}