CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

列表模板类双向链表

楼主SUN1187(搞不懂)2006-03-03 11:00:59 在 C/C++ / C++ 语言 提问

利用双向链表形成List类能输入输出  
   
  对列表的运算符+,-,+=,-=进行重载等一般操作  
   
  可利用链表对象和C   的一维数组构造链表对象以及拷贝构造对象  
   
  链表支持一般的数据类型  
   
  能做添加、删除节点等操作  
   
  支持输入输出插入运算>>和<<  
   
  初学者求助,谢了  
  问题点数:50、回复次数:3Top

1 楼zzw820626(偶要分,偶要星星)回复于 2006-03-03 11:07:53 得分 0

作业贴Top

2 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-03 11:38:34 得分 50

#include<iostream>  
  using   namespace   std;  
  template<class   I>  
  struct         _List_Node    
  {  
   
  typedef   I           value_type;  
  _List_Node         *_Prev;  
  _List_Node         *_Next;  
  value_type           _data;  
   
  };  
   
  template<class   T,class   Ref,class   Ptr>  
  struct       itreator_node  
  {  
         
      public:  
        typedef   T   value_type   ;  
        typedef   itreator_node<T,T&,T*>   iterator;  
        typedef   itreator_node<T,Ref,Ptr>   self;  
        typedef   Ptr       pointer   ;  
        typedef   Ref       reference;  
                typedef   _List_Node<T>*   link_type;  
        link_type   Node;  
         
        self   &operator++()  
        {      
        Node=Node->_Next;  
        return   *this;  
        }  
        self   &operator++(int   )  
        {      
        self   temp=(*this);  
        ++(*this);  
        return   temp;  
        }  
        self   &operator--()  
        {  
        Node=Node->_Prev;  
        return   (*this);  
        }  
        self   operator--(int)  
        {  
        iterator_node   temp=(*this);  
        ++(*this);  
        return   temp;  
        }  
        reference   operator   *()  
        {  
        return   (*Node)._data;  
        }    
        pointer     operator->()  
        {    
        return   &(operator*())            
        }  
        bool   operator   !=(const   itreator_node       temp)  
        {  
         
        return   ((this->Node)!=(temp.Node));  
        }  
        bool   operator==(const   itreator_node   temp)  
        {  
        return   (this->Node)==(temp.Node);  
        }  
        friend   ostream   &operator<<(   ostream   &os,const   self     &itr)  
        {  
         
        os<<itr.Node->_data;  
        return   os;  
        }  
        void   operator   delete[](void     *tempNode)  
        {  
                delete   tempNode;  
             
        }  
  };  
   
   
  template<class     T>  
  class   List      
  {  
  public:  
          typedef           itreator_node<T,T&,T*>     value_type;  
  typedef           itreator_node<T,T&,T*>   iterator;  
          typedef           ptrdiff_t       difference_type;  
  typedef           size_t             size_type;  
  typedef         _List_Node<T>*   link_type;  
  List():list_size(0)  
  {  
  _cur_node_ptr=_front_node_ptr=_end_node_ptr=NULL;  
  }  
  List(T     *begin,T   *end):list_size(0)  
  {  
   
    for(T   *temp=begin;temp<=end;temp++)  
  {  
  if(temp==begin)  
  {  
  iterator   *p1=new   value_type();  
  p1->Node=new   _List_Node<T>();  
  p1->Node->_data=*temp;  
  p1->Node->_Prev=NULL;  
  p1->Node->_Next=NULL;  
  _end_node_ptr=   _front_node_ptr=p1;  
   
  }  
  else    
  {  
  iterator   *p1=new   value_type();  
  p1->Node=new   _List_Node<T>();  
  p1->Node->_data=*temp;  
  push_back(p1);  
  }  
  list_size++;  
  }  
          iterator   *p2=new   value_type();  
  p2->Node=new   _List_Node<T>();  
                  p2->Node->_Prev=_end_node_ptr->Node;    
  p2->Node->_Next=NULL;  
  _end_node_ptr->Node->_Next=p2->Node;  
                  _end_node_ptr=p2;  
           
  }  
  T   &operator   [](const   int   &i)  
  {  
  iterator   temp=*_front_node_ptr;  
  for(int   j=0;j<i;j++)  
  {  
      ++temp;  
  }  
  return   temp.Node->_data;  
  }  
   
  bool   push_back(iterator   *NodePtr)  
  {  
  if(NodePtr==NULL)   return   false;  
  _end_node_ptr->Node->_Next=NodePtr->Node;  
  NodePtr->Node->_Prev=_end_node_ptr->Node;  
  NodePtr->Node->_Next=NULL;  
  _end_node_ptr=NodePtr;  
  return   true;  
  }  
          iterator   &erase(iterator   &itr)  
  {  
                   
                  --list_size;  
  link_type   next_node=itr.Node->_Next;  
                  link_type   prev_node=itr.Node->_Prev;  
  if(itr==begin())  
  {  
  next_node->_Prev=NULL;  
  delete   itr.Node;  
  itr.Node=next_node;  
  *_front_node_ptr=itr;  
  return   itr;    
  }  
  else   if(itr==end())  
  {  
                  prev_node->_Next=NULL;  
  *_end_node_ptr=--itr;  
  ++itr;  
  delete   itr.Node;  
  itr.Node=next_node;  
  return   itr;    
  }  
  else  
  {  
  prev_node->_Next=next_node;  
  next_node->_Prev=prev_node;  
  delete   itr.Node;  
  itr.Node=next_node;  
          return   itr;    
  }  
   
  }  
   
  size_type       size()   const    
  {  
  return     list_size;  
  }  
  iterator   begin()  
  {  
  return   *_front_node_ptr;  
  }  
  iterator   end()  
  {  
  return   *_end_node_ptr;  
  }  
          virtual   ~List()  
  {  
         
   
  };  
   
   
   
   
  private:  
  size_type           list_size;  
  iterator           *_front_node_ptr;  
  iterator           *_end_node_ptr;  
  };Top

3 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-03 11:39:19 得分 0

很早前写的代码,可能还有些问题,不自己看看吧!Top

相关问题

  • DATAGRID定制模板中,怎样加入单选列表控件?
  • 模板中的链接,急!!
  • “在引用模板名称的地方,必须伴有该模板的参数列表” 请问如何理解?
  • 在DataGrid的模板列中使用下拉列表,EditCommand时,选择下拉列表的值,无效?
  • DropDownList 在程序中增加列表项,不能在模板中设置 SelectedIndex ?
  • 有关 模板类 的 链接 问题
  • 链表模板使用方式
  • 动态链接库 数据模板
  • DataGrid模板列中的编辑模板中有一个列表框,如何在编辑时动态改变内容?
  • 关于双向链表的问题?

关键词

  • template
  • null
  • node
  • itr
  • itreator
  • prev
  • nodeptr
  • 链表
  • ptr
  • iterator

得分解答快速导航

  • 帖主:SUN1187
  • piaochen_2002

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo