数据结构线性链表C++模板

通过链式数据结构来实现线性表的功能

 

template 
class LinkList {
    //线性链表节点数据结构
    struct LNode {
        ElemType data;      //用于存储节点数据
        LNode *next;        //用于指向下一个节点的指针
    };
private:
    LNode *m_pHead;    //定义头结点
    LNode *q;          //定义普通节点,用来存储
    LNode *p;          //p为线性链表的指针
public:
    //无参构造函数,构造一个空的线性链表
    LinkList() {
        m_pHead = new LNode;      //申请头结点空间
        m_pHead->next = NULL;     //将头结点下一个指向空,线性链表构造成功
    }

    //有参构造函数,参数为初始线性表的长度,构造一个空的线性表
    LinkList(int init_size) {
        m_pHead = new LNode;      //申请头结点空间
        m_pHead->next = NULL;     //将头结点下一个指向空,线性链表构造成功
        p = m_pHead;              //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (p && init_size--) {
            q = new LNode;        //构造空节点
            q->next = p->next;    //q的下一个节点为原p节点的下一个节点信息
            p->next = q;          //插入节点q
            p = p->next;          //指针向后移动
        }
    }

    //有参构造函数,参数为初始线性表的长度,以及初始化某一个元素的值,构造一个空的线性表
    LinkList(int init_size, ElemType init_elem) {
        m_pHead = new LNode;      //申请头结点空间
        m_pHead->next = NULL;     //将头结点下一个指向空,线性链表构造成功
        p = m_pHead;              //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (p && init_size--) {
            q = new LNode;        //构造空节点
            q->data = init_elem;  //线性链表中的元素全部初始化为init_elem
            q->next = p->next;    //q的下一个节点为原p节点的下一个节点信息
            p->next = q;          //插入节点q
            p = p->next;          //指针向后移动
        }
    }

    //析构函数,用于释放线性链表空间,销毁线性链表
    ~LinkList() {
        while (m_pHead) {        //当头结点指向空时,认为此线性链表为空表
            p = m_pHead->next;   //p为线性链表的指针,从头结点之后开始,头结点不存储信息
            delete m_pHead;      //释放节点空间
            m_pHead = p;         //继续释放下一个节点的空间
        }
    }

    //清空链表数据
    void ClearList() {
        p = m_pHead;            //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (p) {
            p->data = NULL;      //将线性链表中的数据置为空
            p = p->next;         //指针向后移动
        }
    }

    //判断线性链表是否为空
    bool ListEmpty() {
        if (!m_pHead)            //当头结点指向空时,认为此线性链表为空表
            return true;
        else
            return false;
    }

    //返回线性链表中第i个数据元素的值
    ElemType GetElem(int i) {
        p = m_pHead;            //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (p->next && i--)  //找到第i个元素
            p = p->next;        //指针向后移动
        return p->data;         //返回第i个元素
    }

    //获取线性链表的长度
    int LinkLength() {
        int count = 1;
        p = m_pHead->next;      //p为线性链表的指针,从头结点之后开始,头结点不存储信息
        while (p->next) {       //找到表尾
            p = p->next;        //指针向后移动
            count++;
        }
        return count;
    }

    //判断线性链表中第一个与e相等的数据元素的位序,如果不存在返回-1
    int LocateElem(ElemType e) {
        int count = 1;
        p = m_pHead->next;      //p为线性链表的指针,从头结点之后开始,头结点不存储信息
        while (p->next) {       //找到e元素
            if (e == p->data)
                return count;
            p = p->next;        //指针向后移动
            ++count;
        }
        if (count == LinkLength())  //若没有找到该元素
            return -1;
    }

    // 在线性链表中第i个位置之前插入新的数据元素e
    void ListInsert(int i, ElemType e) {
        p = m_pHead;            //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (p->next && i--)  //找到第i个元素
            p = p->next;        //指针向后移动
        q = new LNode;          //q为新建链表节点
        q->data = e;            //将e赋值给q的数据域
        q->next = p->next;      //q的下一个节点为原p节点的下一个节点信息
        p->next = q;            //在p后面接上q节点
    }

    // 在线性链表中删除第i个元素
    void ListDelete(int i) {
        p = m_pHead;            //p为线性链表的指针,从头结点开始,头结点不存储信息
        while (i--)             //找到第i个元素
            p = p->next;        //指针向后移动
        q = p->next;            //q即为要被删除第i个元素
        p->next = q->next;      //p的下一个节点为原q节点的下一个节点信
        delete q;               //释放q原本占有的空间
    }
};

你可能感兴趣的:(C++,数据结构与算法)