中学者 发表于 2008-6-8 11:05

[原创] 一个链表类....

自己折腾了一天,还是不如人意.....算是练练手吧,这个类原本是写上迭代器的,后面加了又删,删了又加,始终写不好...最后就不要了....不过作为学习来说,目的算是达到了-----异常安全.
能帮忙加上迭代器的就加加...谢谢 ^ ^.
[quote][font=新宋体][size=1.5][color=#008000]/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
[/color][color=#FF0000]#ifndef [/color][color=#800080]DATASTRUCT_H_
[/color][color=#FF0000]#define [/color][color=#800080]DATASTRUCT_H_
[/color][color=#FF0000]#include<iostream>
[/color][color=#FF0000]#include<vector>
[/color][color=#FF0000]#include<cassert>

[/color][color=#0000FF]template[/color]<typename _Ty>
[color=#0000FF]class [/color]Linklist
[color=#800000]{
    [/color][color=#0000FF]struct [/color]node_
    [color=#800000]{
        [/color]_Ty value_;
        node_* next,*pre;
        node_ * first;
        [color=#008080]node_[/color]([color=#0000FF]const [/color]_Ty& value): [color=#008080]value_[/color](value)
        [color=#800000]{
            [/color]pre=next=first=[color=#800080]0[/color];
        [color=#800000]}
        [/color]~[color=#008080]node_[/color]()[color=#800000]{ [/color][color=#FF0000]std[/color]::[color=#FF0000]cout[/color]<<[color=#FF00FF]" destroty......"[/color]<<[color=#FF0000]std[/color]::[color=#FF0000]endl[/color];[color=#800000]}
    } [/color];
    [color=#0000FF]typedef [/color]typename Linklist<_Ty>::node_*  pointer;
    [color=#0000FF]typedef [/color]typename Linklist<_Ty>::node_ [color=#0000FF]const[/color]*  const_pointer;
    [color=#0000FF]typedef [/color]typename Linklist<_Ty>::node_&  reference;
    [color=#0000FF]typedef [/color]typename Linklist<_Ty>::node_&  const_reference;
[color=#0000FF]public[/color]:
    [color=#008080]Linklist[/color]();
    [color=#008080]Linklist[/color]([color=#0000FF]const [/color]Linklist<_Ty>& source);
    Linklist<_Ty>& [color=#0000FF]operator[/color]=([color=#0000FF]const [/color]Linklist<_Ty>& source);
    ~[color=#008080]Linklist[/color]();

    [color=#0000FF]bool [/color][color=#008080]empty[/color]() [color=#0000FF]const [/color][color=#800000]{ [/color][color=#0000FF]return [/color](head_==[color=#800080]0[/color]); [color=#800000]}
    [/color][color=#0000FF]int [/color][color=#FF8000]size[/color]() [color=#0000FF]const [/color][color=#800000]{ [/color][color=#0000FF]return [/color]size_; [color=#800000]}
    [/color]pointer [color=#FF8000]begin[/color]() [color=#800000]{ [/color][color=#0000FF]return [/color]head_; [color=#800000]}
    [/color]pointer [color=#FF8000]end[/color]() [color=#800000]{ [/color][color=#0000FF]return [/color]tail_; [color=#800000]}
    [/color]const_pointer [color=#FF8000]begin[/color]() [color=#0000FF]const [/color][color=#800000]{ [/color][color=#0000FF]return [/color]head_; [color=#800000]}
    [/color]const_pointer [color=#FF8000]end[/color]() [color=#0000FF]const [/color][color=#800000]{ [/color][color=#0000FF]return [/color]tail_; [color=#800000]}
    [/color][color=#0000FF]void [/color][color=#008080]Insert[/color]([color=#0000FF]const [/color]_Ty& value,pointer at_);
    [color=#0000FF]void [/color][color=#008080]Delete[/color](pointer at_);
    pointer Linklist<_Ty>::[color=#008080]Find[/color]([color=#0000FF]int [/color]pos)
    [color=#800000]{
        [/color][color=#0000FF]return [/color][color=#FF8000]find[/color](pos);
    [color=#800000]}
    [/color]const_pointer [color=#008080]Find[/color]([color=#0000FF]int [/color]pos) [color=#0000FF]const
    [/color][color=#800000]{
        [/color][color=#0000FF]return [/color][color=#FF8000]find[/color](pos);
    [color=#800000]}
    [/color][color=#0000FF]void [/color][color=#008080]print[/color]() [color=#0000FF]const
    [/color][color=#800000]{
        [/color][color=#0000FF]for[/color](node_* it=head_;it!=[color=#800080]0[/color];it=it->next )
            [color=#FF0000]std[/color]::[color=#FF0000]cout[/color]<<it->value_<<[color=#FF00FF]" "[/color];
        [color=#FF0000]std[/color]::[color=#FF0000]cout[/color]<<[color=#FF0000]std[/color]::[color=#FF0000]endl[/color];
    [color=#800000]}
[/color][color=#0000FF]private[/color]:
    pointer [color=#008080]link[/color](pointer at_f,pointer at_,pointer at_l)
    [color=#800000]{
        [/color][color=#0000FF]if[/color](at_f!=[color=#800080]0[/color]) at_f->next=at_;
        [color=#0000FF]if[/color](at_l!=[color=#800080]0[/color])        at_l->pre=at_;
        at_->pre=at_f;
        at_->next=at_l;
        at_->first=head_;
        [color=#0000FF]return [/color]at_;
    [color=#800000]}
    [/color]pointer [color=#008080]allocated[/color]()
    [color=#800000]{
        [/color][color=#0000FF]return [/color]static_cast<pointer>(::[color=#0000FF]operator new[/color]([color=#0000FF]sizeof[/color](node_)));
    [color=#800000]}
    [/color][color=#0000FF]void [/color][color=#008080]destroy[/color](pointer des_)
    [color=#800000]{
        [/color]des_->~[color=#008080]node_[/color]();
    [color=#800000]}
    [/color]pointer [color=#FF8000]find[/color]([color=#0000FF]int [/color]pos) [color=#0000FF]const
    [/color][color=#800000]{
        [/color][color=#008080]assert[/color](pos>[color=#800080]0[/color]&&pos<=size_);
        [color=#0000FF]if[/color](pointer check=head_)
        [color=#800000]{
            [/color][color=#0000FF]for[/color](;pos>[color=#800080]1[/color];--pos) check=check->next;
            [color=#0000FF]return [/color]check;
        [color=#800000]}
        [/color][color=#0000FF]return [/color][color=#800080]0[/color];
    [color=#800000]}
    [/color][color=#0000FF]void [/color][color=#008080]copy_[/color]([color=#0000FF]const [/color]Linklist<_Ty>& source);
[color=#0000FF]private[/color]:
    pointer  head_,tail_;
    [color=#0000FF]int [/color]size_;
[color=#800000]}[/color];
[color=#008000]//  具体实现
[/color][color=#0000FF]template[/color]<typename _Ty>
[color=#0000FF]void [/color]Linklist<_Ty>::[color=#008080]copy_[/color]([color=#0000FF]const [/color]Linklist<_Ty>& source)
[color=#800000]{
    [/color]pointer iter=[color=#FF8000]begin[/color](),iter_pre=[color=#FF8000]begin[/color](),h_=[color=#FF8000]begin[/color]();
    [color=#0000FF]for[/color](const_pointer cPtr=source.[color=#FF8000]begin[/color]();cPtr!=[color=#800080]0[/color];cPtr=cPtr->next)
    [color=#800000]{
        [/color]iter=[color=#008080]allocated[/color]();
        [color=#0000FF]new [/color](iter)[color=#008080]node_[/color](cPtr->value_);
        [color=#0000FF]if[/color](h_)
        [color=#800000]{
            [/color]iter_pre=[color=#008080]link[/color](iter_pre,iter,[color=#800080]0[/color]);
            iter_pre->first=h_;
        [color=#800000]}
        [/color][color=#0000FF]else
        [/color][color=#800000]{
            [/color]iter_pre=[color=#008080]link[/color](iter_pre,iter,[color=#800080]0[/color]);
            iter_pre->first=h_=iter_pre;
        [color=#800000]}
        [/color]iter=iter->next;
    [color=#800000]}
    [/color]head_=iter_pre?iter_pre->first:[color=#800080]0[/color];
    tail_=iter_pre;
    size_=source.size_;
[color=#800000]}
[/color][color=#0000FF]template[/color]<typename _Ty>
[color=#0000FF]inline [/color]Linklist<_Ty>::[color=#008080]Linklist[/color]():[color=#008080]head_[/color]([color=#800080]0[/color]),[color=#008080]tail_[/color]([color=#800080]0[/color]),[color=#008080]size_[/color]([color=#800080]0[/color])
[color=#800000]{
}
[/color][color=#0000FF]template[/color]<typename _Ty>
Linklist<_Ty>::[color=#008080]Linklist[/color]([color=#0000FF]const [/color]Linklist<_Ty>& source):[color=#008080]head_[/color]([color=#800080]0[/color]),[color=#008080]tail_[/color]([color=#800080]0[/color]),[color=#008080]size_[/color]([color=#800080]0[/color])
[color=#800000]{
    [/color][color=#008080]copy_[/color](source);
[color=#800000]}
[/color][color=#0000FF]template[/color]<typename _Ty>
Linklist<_Ty>& Linklist<_Ty>::[color=#0000FF]operator[/color]=([color=#0000FF]const [/color]Linklist<_Ty>& source)
[color=#800000]{
    [/color][color=#0000FF]if[/color]( [color=#0000FF]this[/color]!=&source) [color=#008080]copy_[/color](source);
    [color=#0000FF]return [/color]*[color=#0000FF]this[/color];
[color=#800000]}
[/color][color=#0000FF]template[/color]<typename _Ty>
Linklist<_Ty>::~[color=#008080]Linklist[/color]()
[color=#800000]{
    [/color][color=#0000FF]for[/color](node_* d=[color=#FF8000]begin[/color](),*t;d!=[color=#800080]0[/color];d=t)
    [color=#800000]{
        [/color]t=d->next;
        [color=#008080]destroy[/color](d);
        ;;[color=#0000FF]operator delete[/color](d);
    [color=#800000]}
}
[/color][color=#0000FF]template[/color]<typename _Ty>
[color=#0000FF]void [/color]Linklist<_Ty>::[color=#008080]Insert[/color]([color=#0000FF]const [/color]_Ty& value,pointer at_)
[color=#800000]{
    [/color]node_* node=[color=#008080]allocated[/color]();
    [color=#0000FF]new [/color](node)[color=#008080]node_[/color](value);
    [color=#0000FF]if[/color]( head_==[color=#800080]0[/color])
    [color=#800000]{
        [/color]head_=tail_=[color=#008080]link[/color]([color=#800080]0[/color],node,[color=#800080]0[/color]);
        node->first=head_;
    [color=#800000]}
    [/color][color=#0000FF]else if[/color]( at_==head_)
    [color=#800000]{
        [/color]head_=[color=#008080]link[/color]([color=#800080]0[/color],node,head_);
        [color=#0000FF]for[/color](;node;node=node->next)
            node->first=head_;
    [color=#800000]}
    [/color][color=#0000FF]else if[/color]( at_==tail_)  tail_=[color=#008080]link[/color](at_,node,[color=#800080]0[/color]);
    [color=#0000FF]else [/color][color=#008080]link[/color](at_->pre,node,at_);
    size_++;
[color=#800000]}
[/color][color=#0000FF]template[/color]<typename _Ty>
[color=#0000FF]void [/color]Linklist<_Ty>::[color=#008080]Delete[/color](pointer at_)
[color=#800000]{
    [/color][color=#008080]assert[/color](at_!=[color=#800080]0[/color]);
    [color=#0000FF]if[/color]( head_==[color=#800080]0[/color])  [color=#0000FF]throw [/color][color=#FF00FF]"it is empty so that delete...."[/color];
    [color=#0000FF]if[/color]( at_==head_)
    [color=#800000]{
        [/color][color=#0000FF]if[/color](tail_==head_ ) tail_=[color=#800080]0[/color];
        head_=head_->next;
        [color=#0000FF]for[/color](node_* t_=head_;t_;t_=t_->next)
        t_->first=head_;
    [color=#800000]}
    [/color][color=#0000FF]else if[/color]( at_=tail_)  tail_=[color=#008080]link[/color](tail_->pre->pre,tail_->pre,[color=#800080]0[/color]);
    [color=#0000FF]else [/color][color=#008080]link[/color](at_->pre->pre,at_->pre,at_->next);
    [color=#008080]destroy[/color](at_);
    ::[color=#0000FF]operator delete[/color](at_);
    size_--;
[color=#800000]}
[/color][color=#FF0000]#endif[/color][/size][/font][/quote]

[[it] 本帖最后由 中学者 于 2008-6-8 11:44 编辑 [/it]]

stdlll 发表于 2008-6-8 12:18

你的node_里只要
   next,*pre;
就够了吧,多了一个 first不是浪费空间吗?

中学者 发表于 2008-6-8 12:22

......是写来为不相交集合作对象的....想把不相交集合用链表和树都做一遍.

页: [1]

编程论坛