设为首页 加入收藏

TOP

双向循环链表的实现(二)
2013-05-03 18:18:22 来源: 作者: 【 】 浏览:123
Tags:双向 循环 实现

 

    template<class T>

    void List<T>::makeEmpty() //全部销毁指针资源

    {

    LinkNode<T> *current = first->next;

    LinkNode<T> *del;

    while(current != first)

    {

    del = current;

    current = current->next;

    delete del;

    }

    }

    template<class T>

    int List<T>::Length() const

    {

    int count = 0;

    LinkNode<T> *current = first;//头指针副本用于遍历

    while(current->next != first)//与单链表的遍历控制条件相同,当前结点后后继是否为空

    {

    current = current->next;

    count++ ;

    }

    return count;

    }

    template<class T>

    LinkNode<T>* List<T>::getHead() const

    {

    return first;

    }

    template<class T>

    LinkNode<T>* List<T>::Search(T x) const

    {

    LinkNode<T> *current = first->next;

    while(current != NULL)//此时的控制条件为某个结点的next知否为空

    {

    if(current->data == x)

    return current;//如果查询到直接函数返回,不用无用操作(如果链表中有多个x元素值,则以第一个为准返回)

    current = current->next;

    }

    return NULL;

    }

    template<class T>

    LinkNode<T>* List<T>::Locate(int i) const

    {

    if(i < 0)     //定位可以是第0个,也就是头结点指针

    return NULL;

    LinkNode<T> *current = first;int k=0;

    while(current != NULL && k < i)//双条件控制后者其更多的作用

    {

    current = current->next;

    k++;

    }

    return current;//指向第i个元素的指针

    }

    template<class T>

    bool List<T>::GetData(int i,T& x) const   //参数中有下标值的一般先判断其下标值是否合法

    {

    if(i <= 0)

    return false;

    LinkNode<T> *current = Locate(i);

    if(current == NULL)

    return false;

    x = current->data;

    retrun true;

    }

    template<class T>

    bool List<T>::SetData(int i,T& x)

    {

    if(i <= 0)

    return false;

    LinkNode<T> *current = Locate(i);

    if(current == NULL)

    return false;

    current->data = x;

    return true;

    }

    template<class T>

    bool List<T>::Insert(int i,T& x)

    {

    if(i < 0 )//可以插入在第一个结点之前,有头结点的好处代码一致

    return false;

    LinkNode<T> *current = Locate(i);

    return false;

    LinkNode<T> *newNode = new LinkNode<T>(x);

    if(newNode == NULL)

    return false;

    newNode->prior = current; //双向链表插入的关键四步,顺序不能变,最后一句必须最后执行

    newNode->next = current->next;

    current->next->prior = newNode;

    current->next = newNode;

    return true;

    }

    template<class T>

    LinkNode<T>* List<T>::Remove(int i,T& x)

    {

    if(i <= 0)

    return NULL;

    LinkNode<T> *current = Locate(i);//和单链表不同的是,双向链表有前指针可以指向前驱,所以定位到第i个就好

    if(current ==NULL)

    return NULL;

    current->next->prior = current->prior;//双向链表删除操作较为简单明了

    current->prior->next = current->next;//重新搭链

    x = current->data;

    delete current;//销毁指针资源

    }

    template<class T>

    bool List<T>::isEmpty() const

    {

        

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇双向链表的实现 下一篇二叉树的12大问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: