双向链表

 

#ifndef DBLLIST_H

#define DBLLIST_H

 

#include <iostream>

using namespace std;

 

template<class T>

struct DblNode

{

     T data;  //链表结点数据

     DblNode<T> *lLink,*rLink;   //链表前驱(左链)、后继(右链)指针

     DblNode(DblNode<T> *left = NULL,DblNode<T> *right = NULL)

         :lLink(left),rLink(right){}

     DblNode(T value,DblNode<T> *left = NULL,DblNode<T> *right = NULL)

         :data(value),lLink(left),rLink(right){}

};

 

template<class T>

class DblList

{

public:

     DblList();

     DblList(T uniqueVal);

     ~DblList()

     {

         delete first;

     }

     int Length()const;

     bool IsEmpty()

     {

         return first->rLink == first;

     }

     DblNode<T> *GetHead()const  //取附加头结点地址

     {

         return first;

     }

     void SetHead(DblNode<T> *ptr)    //设置附加头结点地址

     {

         first = ptr;

     }

     DblNode<T> *Search(const T &x);  //在链表中沿后继方向寻找等于给定值x的结点

     DblNode<T> *Locate(int i,int d); //在链表中定位诒为i(>=0)的结点,d=0按前驱方向,d<>0按后继方向

     bool Insert(int i,const T &x,int d); //在第i个结点后插入一个包含有值x的新结点,d=0按前驱方向,d<>0按后继方向

     bool Remove(int i,T &x,int d);   //删除第i个结点,x返回其值,d=0按前驱方向,d<>0按后继方向

private:

     DblNode<T> *first;

};

 

template<class T>

DblList<T>::DblList()

{

     first = new DblNode<T>;

     if (first == NULL)

     {

         cerr<<"存储分配错误!"<<endl;

         exit(1);

     }

     first->lLink = first->rLink = first;

}

 

template<class T>

DblList<T>::DblList(T uniqueVal)

{

     first = new DblNode<T>(uniqueVal);

     if (first == NULL)

     {

         cerr<<"存储分配错误!"<<endl;

         exit(1);

     }

     first->lLink = first->rLink = first;

}

 

template<class T>

int DblList<T>::Length()const

{

     DblNode<T> *current = first->rLink;

     int count = 0;

     while (current != first)

     {

         ++count;

         current = current->rLink;

     }

     return count;

}

 

template<class T>

DblNode<T> *DblList<T>::Search(const T &x)

{

     DblNode<T> *current = first->rLink;

     while (current != first && current->data != x)

         current = current->rLink;

     if(current != first)

         return current;

     else

         return NULL;

}

 

template<class T>

DblNode<T> *DblList<T>::Locate(int i,int d)

{

     if (first->rLink == first || i == 0)

         return first;

     DblNode<T> *current;

     if(d == 0)

         current = first->lLink;

     else

         current = first->rLink;

     for (int j = 1;j < i;++j)

     {

         if(current == first)   //链太短,退出搜索

              break;

         else if(d == 0)

              current = current->lLink;

         else

              current = current->rLink;

     }

     if(current != first)

         return current;

     else

         return NULL;

}

 

template<class T>

bool DblList<T>::Insert(int i,const T &x,int d)

{

     DblNode<T> *current = Locate(i,d);

     if(current == NULL)

         return false;

     DblNode<T> *newNode = new DblNode<T>(x);

     if (newNode == NULL)

     {

         cerr<<"存储分配错误!"<<endl;

         exit(1);

     }

     if (d == 0)

     {

         newNode->lLink = current->lLink;

         current->lLink = newNode;

         newNode->lLink->rLink = newNode;

         newNode->rLink = current;

     }

     else

     {

         newNode->rLink = current->rLink;

         current->rLink = newNode;

         newNode->rLink->lLink = newNode;

         newNode->lLink = current;

     }

     return true;

}

 

template<class T>

bool DblList<T>::Remove(int i,T &x,int d)

{

     DblNode<T> *current = Locate(i,d);

     if(current == NULL)

         return false;

     current->rLink->lLink = current->lLink;

     current->lLink->rLink = current->rLink;

     x = current->data;

     delete current;

     return true;

}

 

#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值