您的位置:程序门 -> c/c++ -> c++ 语言



二叉查树


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


二叉查树
发表于:2008-01-22 06:43:50 楼主
大家帮我看看这个程序错什么地方了啊   (二叉查树)
还有为什么我吧treenode改成如下的形式就没错了啊
template   <class   nodetype>
class   treenode
{
            friend   class   tree <nodetype> ;
      public:
            treenode(const   nodetype   &d):leftptr(null),data(d),rightptr(null){}
            nodetype   getdata()   const
            {
            return   data;
            }
 
      private:
            treenode <nodetype>   *leftptr;
            nodetype   data;
            treenode <nodetype>   *rightptr;
};
这不是一个意思吗   难到定义和实现不可以分开吗

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

//definition   of   class   treenode
template   <class   nodetype>   class   tree;

template   <class   nodetype>
class   treenode
{
            friend   class   tree <nodetype> ;
      public:
            treenode(const   nodetype   &d);
                    nodetype   getdata()   const;
      private:
            treenode <nodetype>   *leftptr;
            nodetype   data;
            treenode <nodetype>   *rightptr;
};

//member   function   definition   for   class   treenode
template   <class   nodetype>
treenode::treenode(const   nodetype   &d):leftptr(null),data(d),rightptr(null)
{}

template   <class   nodetype>
nodetype   treenode::getdata(void)   const
{
            return   data;
}


//definition   of   class   tree
template   <class   nodetype>
class   tree
{
            public:
                    tree();
                    void   insertnode(const   nodetype&);
                    void   preordertraversal()   const;
                    void   inordertraversal()   const;
                    void   postordertraversal()   const;
            private:
                    treenode <nodetype>   *rootptr;
                   
                    //utility   function
                    void   insertnodehelper(treenode <nodetype>   **,const   nodetype&);  
                    void   preorderhelper(treenode <nodetype>   *)   const;
                    void   inorderhelper(treenode <nodetype>   *)   const;
                    void   postorderhelper(treenode <nodetype>   *)   const;
};

//member   function   definition   for   class   tree
template   <class   nodetype>
tree <nodetype> ::tree()
{
              rootptr=0;
}

template   <class   nodetype>
void   tree <nodetype> ::insertnode(const   nodetype   &value)
{
            insertnodehelper(&rootptr,value);
}

//this   function   receives   a   pointer   to   a   point   so   the
//pointer   can   be   modified
template   <class   nodetype>
void   tree <nodetype> ::insertnodehelper(treenode <nodetype>   **ptr,const   nodetype   &value)
{
          if(*ptr==0)
          {    
              *ptr=new   treenode <nodetype> (value);
    //           assert(*ptr!=0);
          }
          else
                if(value <(*ptr)-> data)
                      insertnodehelper(&((*ptr)-> leftptr),value);
                else
                      if(value> (*ptr)-> data)
                            insertnodehelper(&((*ptr)-> rightptr),value);
                      else
                            cout < <value < <"   dup" < <endl;
}

template   <class   nodetype>
void   tree <nodetype> ::preordertraversal()const
{
          preorderhelper(rootptr);
}  

template   <class   nodetype>
void   tree <nodetype> ::preorderhelper(treenode <nodetype>   *ptr)   const  
{
          if(ptr!=0)
          {
                cout < <ptr-> data < <"     ";  
                preorderhelper(ptr-> leftptr);
                preorderhelper(ptr-> rightptr);
          }
}                  
 
template   <class   nodetype>
void   tree <nodetype> ::inordertraversal()const
{
          inorderhelper(rootptr);                          
}

template   <class   nodetype>
void   tree <nodetype> ::inorderhelper(treenode <nodetype>   *ptr)   const  
{
          if(ptr!=0)
          {
                inorderhelper(ptr-> leftptr);
                cout < <ptr-> data < <"     ";
                inorderhelper(ptr-> rightptr);
          }
}

template   <class   nodetype>
void   tree <nodetype> ::postordertraversal()const
{
            postorderhelper(rootptr);
}

template   <class   nodetype>
void   tree <nodetype> ::postorderhelper(treenode <nodetype>   *ptr)   const
{
          if(ptr!=0)
          {
                  postorderhelper(ptr-> leftptr);
                  postorderhelper(ptr-> rightptr);
                  cout < <ptr-> data < <"     ";
          }
}
                   
                   
int   main()
{
        tree <int>   inttree;
        int   intval,i;
       
        cout < <"enter   10   integer   values:\n";
        for(i=0;i <10;i++)
        {
                  cin> > intval;
                  inttree.insertnode(intval);
        }
       
        cout < <"\npreorder   traversal\n";
        inttree.preordertraversal();
       
        cout < <"\ninorder   traversal\n";
        inttree.inordertraversal();
       
        cout < <"\npostorder   traversal\n";
        inttree.postordertraversal();
        system("pause");
       
        return   0;
       
}
发表于:2008-01-22 09:09:341楼 得分:0
你不会把所谓的“实现”放在.cpp里了吧。
google   模板的分离编译模式

发表于:2008-01-22 09:11:132楼 得分:0
要使用某个模板类,该模板类的定义和实现就要让使用者看得到。因而通常模板类的声明和定义都在头文件中。
模板类在使用时才被具体化的,编译器需要根据具体类型生成对应的类代码(编译器根据需要生成了多个类)。

这个链接中有相当详细的介绍,供参考:
发表于:2008-01-22 14:48:233楼 得分:0
如果定义模板的话,要将声明的代码跟实现的代码放在同一个文件中才可编译.
另一种分离模式是使用export关键字,不过很少有编译器支持


快速检索

最新资讯
热门点击