设为首页 加入收藏

TOP

线性表 - 双链表
2015-07-20 17:42:16 来源: 作者: 【 】 浏览:1
Tags:线性 双链表

List.h

/********************************************************************
    purpose:    带头结点的双链表
    author:     xianyun1230
    QQ:         836663997
    e-mail:     xianyun1230@163.com
    created:    2014/02/18
*********************************************************************/

#include 
  
   


template
   
     class List { public: List(); ~List(); bool push_back(const T &val); //末尾插入数据 bool push_front(const T &val); //开头插入数据 bool pop_front(T &val); //开头删除数据 void reverse(); //链表倒置 bool del(const T & val); //删除所有值为val 的元素 int count(const T & val); //统计val 值出现的次数 bool empty(){return _size == 0;} unsigned int size() const {return _size;} //返回元素个数 void show() const; //遍历链表 T operator[](const int n) const; private: typedef struct _Node { T data; _Node *next, *front; }Node; Node * head, * end; //分别指向头结点、尾指针 unsigned int _size; //元素数 }; template
    
      List
     
      ::List() //默认构造函数,创建头尾结点,元素数为0 { _size = 0; head = new Node; head->front = head; head->next = head; end = head; } template
      
        List
       
        ::~List() { Node * ph = head, *pt = head->next; while(pt != head) { ph = pt->next; delete pt; pt = ph; } } template
        
          bool List
         
          ::push_back(const T & val) { Node *temp = new Node; //temp用作新尾,next属性设为head以循环(循环链表) temp->front = end; temp->data = val; temp->next = head; end->next = temp; end = temp; //指向新尾 ++_size; return true; } template
          
            bool List
           
            ::push_front(const T &val) { Node *temp = new Node; temp->front = head; temp->data = val; temp->next = head->next; head->next = temp; ++_size; return true; } template
            
              bool List
             
              ::pop_front(T &val) { if (_size == 0) return 0; Node *temp = head->next; val = temp->data; //用于返回值 head->next = temp->next; temp->next->front = head; delete temp; --_size; if (_size == 0) end = head; return val; } template
              
                void List
               
                ::reverse() //链表前端就地倒置 { if (_size < 2) return; Node * ps = head->next; //新尾 Node * pn = ps->next; //从第二个结点开始未待倒置部分 Node * pnn = pn->next; //pnn标记待倒置部分 while(pn != head) //到结尾会循环到head { pn->next = head->next; //pn融入已倒置部分 pn->front = head; head->next->front = pn; //head带领已倒置部分 head->next = pn; pn = pnn; pnn = pnn->next; //未倒置部分后移 } ps->next = head; //ps指向的为已倒置部分最后一个结点,指向head保证循环 end = ps; } template
                
                  bool List
                 
                  ::del(const T &val) { bool deled = false; if (_size > 0) { Node * pt = new Node; Node * pl = pt; Node * temp = pl; //用于释放内存 pl->next = head->next; while(pl != head) { if (pl->next->data == val) { temp = pl->next; //存储待删位置 temp->next->front = pl; pl->next = pl->next->next; //隔离待删结点 delete temp; //释放内存 --_size; deled = true; } pl = pl->next; } if (_size == 0) end = head; delete pt; } return deled; } template
                  
                    int List
                   
                    ::count(const T &val) { int n = 0; Node * ps = head->next; while(ps != head) { if (ps->data == val) ++n; ps = ps->next; } return n; } template
                    
                      void List
                     
                      ::show()const { Node *temp = head->next; std::cout <<"链表数据共" <
                      
                       data <
                       
                        next; } std::cout <<"链表倒序遍历共" <
                        
                         data <
                         
                          front; } } template
                          
                            T List
                           
                            ::operator[](const int n) const { if (n < 0 || n >= _size) return 0; int num = n; Node * pt = head->next; while(num--) pt = pt->next; return pt->data; } 
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
   
  


main.cpp

#include 
  
   
#include "List.h"
using namespace std;

int main()
{
	List
   
     link; link.push_back(31); link.push_front(23); link.push_back(12); link.push_back(32); link.push_back(76); link.push_back(93); link.push_back(34); link.show(); link.reverse(); link.del(12); link.show(); link.reverse(); link.show(); cout <
    
     

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇DICOM医学图形处理:storescp.exe.. 下一篇hdu 4638 Group(莫队算法|离线线..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·工业机器人TCP校准中 (2025-12-25 05:19:17)
·opc 通讯协议与 TCP (2025-12-25 05:19:15)
·labview中tcp/ip通信 (2025-12-25 05:19:13)
·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)