c++ 双向链表操作总结

Posted clc2008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 双向链表操作总结相关的知识,希望对你有一定的参考价值。

第一、包含DoubleLinkNode 模板类和DoubleLinkList 模板类 

#pragma once
#include<iostream>
using namespace std;

template <typename T> class DoubleLinkList;//这里必须声明

template<typename T> class DoubleLinkNode {
public:
    T getData() {
        return m_data;
    }
private:    
    DoubleLinkNode() :m_pprior(NULL), m_pnext(NULL) {}
    DoubleLinkNode(const T item, DoubleLinkNode<T>* prior, DoubleLinkNode<T>* pnext) :m_data(item), m_pprior(prior), m_pnext(pnext)
    {}      

    ~DoubleLinkNode() {
        m_pprior = NULL;
        m_pnext = NULL;
    }
    friend class DoubleLinkList<T>; 
    DoubleLinkNode* m_pprior;
    DoubleLinkNode* m_pnext;
    T m_data;
};

template <typename T> class DoubleLinkList {
public:
    DoubleLinkList() {
        head = new DoubleLinkNode<T>();
    }
    ~DoubleLinkList() {
        delete head;
    }
    void cleanDoubleLink();
    bool insertNode(T data);
    bool insertNode(T data,int n);
    void printAll();
    bool deleteNode(T data);
    DoubleLinkNode<T>* findNode(int n);
    DoubleLinkNode<T>* findData(T data);
    bool deleteNodeByIndex(int i);
    T getData(int i);

private:
    friend class DoubleLinkNode<T>;
    DoubleLinkNode<T> *head;
};

template <typename T> void DoubleLinkList<T>::cleanDoubleLink() {
    DoubleLinkNode<T> *pmove = head->m_pnext,*pdel;
    while (pmove != NULL)
    {
        pdel = pmove;
        pmove = pmove->m_pnext;
        delete pdel;
    }  
    head->m_pnext = NULL;
}

template<typename T> bool DoubleLinkList<T>::insertNode(T data) {
    DoubleLinkNode<T> *pmove = head;
    while (pmove->m_pnext!=NULL)
    {
        pmove = pmove->m_pnext;
    }

    DoubleLinkNode<T> *newNode = new  DoubleLinkNode<T>(data,pmove,NULL);
    pmove->m_pnext = newNode;
    return true;
}

template<typename T> bool DoubleLinkList<T>::insertNode(T item,int n) {
    DoubleLinkNode<T> *pmove = head;
    for (int i = 1; i < n; i++)
    {
        pmove = pmove->m_pnext;
        if (pmove==NULL && i<n-1)
        {
            cout << "超出链表长度" << endl;
            return false;
        }
    }
    DoubleLinkNode<T> *newNode = new DoubleLinkNode<T>();
    newNode->m_data = item;

    newNode->m_pnext = pmove->m_pnext;
    newNode->m_pprior = pmove->m_pprior;
    if (pmove->m_pnext!=NULL)
    {
        pmove->m_pnext->m_pprior = newNode;
    }
    pmove->m_pnext = newNode;
    return true;
}

template<typename T> void DoubleLinkList<T>::printAll() {
    DoubleLinkNode<T>* pmove = head->m_pnext;
    while (pmove!=NULL)
    {
        cout << pmove->m_data << " ";
        pmove = pmove->m_pnext;        
    }
    cout << endl;
}

template<typename T> bool DoubleLinkList<T>::deleteNode(T item) {
    DoubleLinkNode<T>* pmove = head;
    while (pmove->m_pnext!=NULL)
    {
        if (pmove->m_data==item)
        {
            break;
        }
        pmove = pmove->m_pnext;
    }
    if (pmove==NULL)
    {
        cout << "没有找到该item" << endl;
        return false;
    }

    pmove->m_pprior->m_pnext = pmove->m_pnext;
    if (pmove->m_pnext!=NULL)
    {
        pmove->m_pnext->m_pprior = pmove->m_pprior;
    }    
    delete pmove;
    return true;
}

template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findNode(int n) {
    if (n<1)
    {
        cout << "指定位置无效" << endl;
        exit(1);
    }
    DoubleLinkNode<T>* pmove = head;
    
    for (int i = 1; i <= n; i++)
    {
        pmove = pmove->m_pnext;
        if (pmove==NULL)
        {
            cout << "指定节点不存在!" << endl;
            exit(1);
        }
    }
    return pmove;
}

template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findData(T item) {
    DoubleLinkNode<T>* pmove = head;
    while (pmove->m_pnext != NULL)
    {
        pmove = pmove->m_pnext;

        if (pmove == NULL)
        {
            cout << "没有找到所查节点" << endl;
            exit(1);
        }
        if (pmove->m_data == item)
        {
            break;
        }
        return pmove;
    }
}

template<typename T> bool DoubleLinkList<T>::deleteNodeByIndex(int n) {
    DoubleLinkNode<T>*pmove = head->m_pnext;
    for (int i = 1; i < n; i++)
    {      
        if (pmove == NULL && i < (n - 1))
        {
            cout << "没有找到该位置,删除失败" << endl;
            return false;
        }
        pmove = pmove->m_pnext;
    }   
    if (pmove->m_pnext!=NULL)
    {
        pmove->m_pprior->m_pnext = pmove->m_pnext;
        pmove->m_pnext->m_pprior = pmove->m_pprior;
    }
    else
    {
        pmove->m_pprior->m_pnext = NULL;
    }
    delete pmove;
    return true;
}

template<typename T> T DoubleLinkList<T>::getData(int n) {
    DoubleLinkNode<T>* pmove = head->m_pnext;
    for (int i = 1; i < n; i++)
    {
        if (pmove==NULL && i<(n-1))
        {
            cout << "没有找到" << endl;
            exit(1);
        }
        pmove = pmove->m_pnext;
    }

    if (pmove==NULL)
    {
        cout << "节点不存在" << endl;
    }
    return pmove->getData();
}

  

以上是关于c++ 双向链表操作总结的主要内容,如果未能解决你的问题,请参考以下文章

双向链表的基础操作(C++实现)

双向链表(c++实现)

C++实现双向链表的所有操作,包括逆置双链表(三种方法)

循环双向链表的C++实现

C++线程安全双向链表

数据结构带头双向循环链表