c++ 双头链表结构,包括节点插入、删除、移动、查找等操作

双头链表相关的类对象

//节点对象
template <class T>
class LinkNode
{
public:
    LinkNode<T> *next;
    LinkNode<T> *prev;
    T data;
};
//链表对象
template <class T>
class ListLink
{
public:
    ListLink();
    ~ListLink();
public:
    void removeLinkList();
    void removeLinkNode(int pos);
    T* addLinkNode(T data);
    T* insertLinkNode(T data, int pos);
    T* tranLinkNode(int curPos, int tranPos);
    T* findLinkNodep(int pos);
    T findLinkNode(int pos);
    LinkNode<T>* findLinkNodeT(int pos);
public:
    //父指针
    ListLink<T> *parent;
    //头指针
    LinkNode<T> *head;
    //底指针
    LinkNode<T> *tail;
    //模板指针
    T* model;
    //链名称
    string name;
    //这条链类型
    int flag;
    //这条链长度
    int size;
    //这条链的索引
    int index;
};

链表初始化状态

//构造函数
template <class T>
ListLink<T>::ListLink()
{
    head=new LinkNode<T>;
    tail=new LinkNode<T>;
    head->next=tail;
    head->prev=nullptr;
    tail->next=nullptr;
    tail->prev=head;
    parent=nullptr;
    model=nullptr;
    size=0;
}
//析构函数释放
template <class T>
ListLink<T>::~ListLink()
{
    this->removeLinkList();
    delete head;
    delete tail;
}

链表插入和删除

//添加到最后
template <class T>
T* ListLink<T>::addLinkNode(T e)
{
    LinkNode<T>* node=new LinkNode<T>;
    node->data=e;
    LinkNode<T>* p=tail->prev;
    p->next=node;
    node->next=tail;
    tail->prev=node;
    node->prev=p;
    size++;
    return &node->data;
}
//链表插入节点
template <class T>
T* ListLink<T>::insertLinkNode(T e, int pos)
{
    if(pos<0 || pos>size)
        return nullptr;
    LinkNode<T>* node=new LinkNode<T>;
    node->data=e;
    if(pos<=size/2)
    {
        LinkNode<T>* p=head;
        for(int i=0;i<=pos;i++)
            p=p->next;
        LinkNode<T> *temp=p->prev;
        temp->next=node;
        node->next=p;
        p->prev=node;
        node->prev=temp;
        size++;
    }
    else
    {
        LinkNode<T>* p=tail;
        for(int i=size-1;i>=pos;i--)
            p=p->prev;
        LinkNode<T> *temp=p->prev;
        temp->next=node;
        node->next=p;
        p->prev=node;
        node->prev=temp;
        size++;
    }
    return &node->data;
}
//链表删除整个链
template <class T>
void ListLink<T>::removeLinkList()
{
   if(size==0)
      return;
   LinkNode<T> *p=head->next;
   while(p!=tail)
   {
       LinkNode<T>* temp=p;
       p=p->next;
       delete temp;
       temp=nullptr;
   }
   head->next=tail;
   tail->prev=head;
   size=0;
}
//链表删除指定节点
template <class T>
void ListLink<T>::removeLinkNode(int pos)
{
    if(pos<0 || pos>=size)
        return;
    if(pos<=size/2)
    {
        LinkNode<T>* p=head;
        for(int i=0;i<=pos;i++)
            p=p->next;
        LinkNode<T> *temp=p->prev;
        temp->next=p->next;
        p->next->prev=temp;
        if(p!=nullptr)
        {
            delete p;
            p=nullptr;
        }
        size--;
    }
    else
    {
        LinkNode<T>* p=tail;
        for(int i=size-1;i>=pos;i--)
            p=p->prev;
        LinkNode<T> *temp=p->prev;
        temp->next=p->next;
        p->next->prev=temp;
        if(p!=nullptr)
        {
            delete p;
            p=nullptr;
        }
        size--;
    }
}

链表查找

//查找对象T*
template <class T>
T* ListLink<T>::findLinkNodep(int pos)
{
    LinkNode<T>* node=head;
    if(pos<0 || pos>=size)
       return nullptr;
    if(pos<=size/2)
    {
        node=head;
        for(int i=0;i<=pos;i++)
            node=node->next;
    }
    else
    {
        node=tail;
        for(int i=size-1;i>=pos;i--)
            node=node->prev;
    }
    return &node->data;
}
//查找对象T
template <class T>
T ListLink<T>::findLinkNode(int pos)
{
    LinkNode<T>* node=head;
    if(pos<0 || pos>=size)
       return node->data;
    if(pos<=size/2)
    {
        node=head;
        for(int i=0;i<=pos;i++)
            node=node->next;
    }
    else
    {
        node=tail;
        for(int i=size-1;i>=pos;i--)
            node=node->prev;
    }
    return node->data;
}
//查找对象LinkNode<T>*
template <class T>
LinkNode<T>* ListLink<T>::findLinkNodeT(int pos)
{
    if(pos<0 || pos>=size)
       return nullptr;
    LinkNode<T>* node=head;
    if(pos<=size/2)
    {
        node=head;
        for(int i=0;i<=pos;i++)
            node=node->next;
    }
    else
    {
        node=tail;
        for(int i=size-1;i>=pos;i--)
            node=node->prev;
    }
    return node;
}

链表移动位置

template <class T>
T* ListLink<T>::tranLinkNode(int cPos, int tPos)
{
   if(!(cPos>=0 && cPos<size))
       return nullptr;
   if(!(tPos>=0 && tPos<size))
       return nullptr;
   if(tPos==cPos)
       return nullptr;
   //删除
   LinkNode<T>* cNode=head;
   for(int i=0;i<=cPos;i++)
       cNode=cNode->next;
   LinkNode<T>* front=cNode->prev;
   LinkNode<T>* last=cNode->next;
   front->next=last;
   last->prev=front;
   //插入
   LinkNode<T>* tFront=head;
   for(int i=0;i<tPos;i++)
       tFront=tFront->next;
   LinkNode<T>* tLast=tFront->next;
   tFront->next=cNode;
   tLast->prev=cNode;
   cNode->prev=tFront;
   cNode->next=tLast;
   return &cNode->data;
}
  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刚出道的菜鸟@丢丢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值