双向链表--主要操作

来源:互联网 发布:java 泛型类 静态方法 编辑:程序博客网 时间:2024/06/14 09:15
#include<iostream>template <typename DataType> class DoubleList;/*对于DoubleList这个类的前向引用声明*/template <typename DataType> class DoubleListNode {    //对DoubleListNode这个模板类进行声明private:    friend class DoubleList<DataType>;  //将DoubleList这个类声明为自己的友元,    //然后DoubleList这个双向链表类就可以调用这个DoubleListNode这个类了    DoubleListNode():m_pprior(NULL), m_pnext(NULL){}    DoubleListNode(const DataType item, DoubleListNode<DataType>* Prior = NULL, DoubleListNode<DataType>* next = NULL):m_data(item), m_pprior(prior), m_pnext(next) {}    //DoubleListNode的两个构造函数    //并且这两个构造函数都被私有化,只有类的成员或者友元才可以访问!    ~DoubleListNode() {//DoubleListNode的析构函数        m_pprior = NULL;   //析构函数中使指针指向了NULL        m_pnext = NULL;    }    DataType m_data;   //数据域    DoubleListNode* m_pprior;//指向前驱结点的指针域    DoubleListNode* m_pnext;//指向后驱结点的指针域public:    DataType getData();  //获取数据的公有成员函数};template <typename DataType> DataType DoubleListNode<DataType>::getData() {    return this->m_data;  //公有成员函数模板getData的类外定义}template<typename DataType> class DoubleList {    //DoubleList双向链表这个模板类的声明public:    DoubleList() {        head = new DoubleListNode<DataType>();    }    ~DoubleList() {        cleanDoubleLink();        delete head;    }public:    void cleanDoubleList();//清空双向链表    int getLength();// 获取双向链表的长度    DoubleListNode<DataType>* findNode(int i = 0);//寻找第i个结点    DoubleListNode<DataType>* findData(DataType item);//寻找具有给定值数据的结点    bool insertNode(DataType item, int i = 0);//在第i个结点的后面插入新的结点    bool removeNode(int i = 0);//删除第i个结点    DataType getData(int i = 0);//获取第i个结点的数据private:    DoubleListNode<DataType>* head;  //头指针};template<typename DataType> void DoubleList<DataType>::cleanDoubleLink() {    DoubleListNode<DataType>* pmove= head->m_pnext, *pdel;    while(pmove != NULL) {  //一次删除指针后面的结点   pdel是一个临时指针  把链表上每个结点的右指针域都遍历一遍        pdel = pmove;        pmove = pdel->m_pnext;        delete pdel;    }    head->m_pnext = NULL;}template <typename DataType> int DoubleList<DataType>::getLength() {    int count = 0;    DoubleListNode<DataType>* pmove = head->m_pnext;//遍历链表计算结点数    while(pmove != NULL) {        pmove = pmove->m_pnext;        count++;    }    return count;}template <typename DataType> DoubleListNode<DataType>* DoubleList<DataType>::findNode(int n = 1) {    if(n < 1) {           //判断位置是否有效0        cout << "非有效位置" << endl;        return NULL:    }    DoubleListNode<DataType>* pmove = head->m_pnext;    for(int i = 1; i < n; i++) {   //利用游标指针pmove查找指定位置的结点        pmove = pmove->m_pnext;        if(pmove == NULL) {   //判断结点的是否存在            cout << "不存在指定结点" << endl;            return NULL;        }    }    return pmove;}template<typename DataType> bool DoubleList<DataType>::insertNode(DataType item, int n) {    int n;    if(n < 1) {     //判断所插入的位置是否有效        cout << "插入位置无效" << endl;        return 0;    }    //创建新结点, 设置游标指针    DoubleListNode<DataType>* newnode = new DoubleListNode<DataType>(item), *pmove = head;    if(newnode == NULL) {        cout << "内存分配失败,新结点无法创建!" << endl;        exit(1);    }    for(i = 1; i < n; i++) {        pmove = pmove->m_pnext;        if(pmove == NULL && i < n-1) {            cout << "超出链表长度,插入位置无效" << endl;            return 0;        }    }    //插入新结点    newnode-> m_pnext= pmove->m_pnext;    if(pmove->m_pnext != NULL) {   //判断是否在链表的尾部添加结点        pmove->m_pnext->m_pprior = newnode;    }    newnode->m_pprior = pmove;    pmove->m_pnext = newnode;    return 1;}template <typename DataType> bool DoubleList<DataType>::removeNode(int n = 1) {    if(n<1 || n>getlength) {        cout << "位置不合法" << endl;        return false;    }    DoubleListNode<DataType>* pmove = head->m_pnext, *pdel;    for(int i = 1; i < n; i++) {        pmove = pmove->m_pnext;        if(pmove == NULL) {            cout << "超出了链表范围" << endl;            return false;        }    }    //删除结点    pdel = pmove;    pmove->m_pprior->m_pnext = pdel->m_pnext;    pmove->m_pnext->m_pprior = pdel->m_pprior;    delete pdel;    return true;}template<typename DataType> DataType DoubleList<DataType>::getData(int n = 1) {    if(n < 1 || n > getlength()) {        cout << "指定位置无效" << endl;        exit(1);    }    DoubleListNode<DataType>*pmove = head->m_next;    for(int i = 1; i < n; i++) {        pmove = pmove->m_next;        if(pmove == NULL) {            cout << "指定结点不存在" << endl;            exit(1);        }    }    if(pmove == NULL) {        cout << "结点不存在" << endl;        return NULL;    }    return pmove->m_data;}template<typename DataType> DoubleListNode<DataType>* DoubleList<DataType>::findData(DataType item) {    DoubleListNode<DataType>* pmove = head->m_pnext;    if(pmove == NULL) {        cout << "链表是空表" << endl;        exit(1);    }    while(pmove->getData() != item) {        pmove = pmove->m_pnext;        if(pmove == NULL) {            cout << "没有所查找的结点" << endl;            exit(1);        }    }    remove pmove;}


主函数部分自己写

0 0
原创粉丝点击