设为首页 加入收藏

TOP

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

 

    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

    {

    return ((first->next == NULL) true : false);

    }

    template<class T>

    void List<T>::input(T endTag)

    {

    LinkNode<T> *newNode,*last = first;

    T value;

    cin》value;

    while(value != endTag)

    {

    newNode = new LinkNode<T>(value);

    newNode->prior = last;

    last->next = newNode;

    last = newNode;

    cin》value;

    }

    }

    template<class T>

    void List<T>::output()//输出

    {

    cout《"双向链表输出如下:"《endl;

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

    int count = 0;

    while(current != NULL)

    {

    cout《"#"《count+1《":"《current->data《endl;

    current = current->next;

    count++;

    }

    }

    template<class T>

    void List<T>::Sort()//最小选择 排序

    {

    LinkNode<T> *current1,*current2;//下面连续取后继指针把外层循环控制在倒数第二个结点

    for(current1 = first->next ; current1->next != NULL ; current1 = current1->next)

    {

    for(current2 = current1->next ; current2 != NULL ; current2 = current2->next)

    {

    if(current1->data > current2->data)

    {

    T temp;

    temp = current1->data;

    current1->data = current2->data;

    current2->data = temp;

    }

    }

    }

    }

    template<class T>

    void List<T>::operator= (List<T> &L)

    {

    makeEmpty();//先全部销毁指针资源

    LinkNode<T> *srcptr = L.getHead() ->next; //获取头指针 用于遍历

    LinkNode<T> *destptr = first;   //= new LinkNode<T>;//不用于赋值初始化,只用于复制,不用建立新头结点

    LinkNode<T> *newNode;

    T value;

    while(srcptr != NULL)//直到最后一个结点的尾指针为空结束

    {

    value = srcptr->data;

    newNode = new LinkNode<T>(value);

    newNode->prior = destptr;//往新链表的后面插入

    destptr->next = newNode;

    srcptr = srcptr->next;//后移

    destptr = destptr->next;

    }

    }

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇disksim使用总结 下一篇双向循环链表的实现

评论

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