双向链表--主要操作

#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;
}


主函数部分自己写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值