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

来源:互联网 发布:林俊杰baby知乎 编辑:程序博客网 时间:2024/06/06 04:39

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

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原本占有的空间    }};

原创粉丝点击