• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Tauruser

            Enjoy Every Day
            posts - 34, comments - 95, trackbacks - 0, articles - 5
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            雙鏈表模版類的實現

            Posted on 2006-05-08 12:47 Tauruser 閱讀(1715) 評論(6)  編輯 收藏 引用 所屬分類: 算法與數據結構
            在模版類加入curpt與curloc兩個變量加速對鏈表的定位
            #ifndef?linklist_h_
            #define?linklist_h_
            #include?
            <iostream>
            using?namespace?std;


            template?
            <class?T>?struct?Element
            {
            ????T?content;
            ????Element
            *?prelink;?//predecesser?link
            ????Element*?suclink;?//successor?link
            };

            template?
            <class?T>?class?dLinkList
            {
            public:
            ????dLinkList();
            ????
            ~dLinkList();
            ????
            void?insert(const?T?&x,int?loc);
            ????
            void?del(int?loc);
            ????
            void?modify(const?T?&x,?int?loc);
            ????
            bool?IsEmpty();
            ????
            //void?list();
            ????int?search(const?T?&x,const?int?startloc?);
            ????
            int?getsum();
            ????T?
            get(int?loc);
            private:
            ????
            void?locate(const?int?loc);//curpt定位于loc
            ????Element<T>*?head;//頭指針
            ????Element<T>*?rear;//尾指針
            ????Element<T>*?curpt;//當前指針
            ????int?curloc;//當前指針位置
            ????int?sum;//鏈表元素總數
            ????
            };


            template?
            <class?T>?dLinkList<T>::dLinkList()
            {
            ????head
            =NULL;
            ????rear
            =NULL;
            ????curpt
            =NULL;
            ????curloc
            =0;
            ????sum
            =0;
            }
            template?
            <class?T>?dLinkList<T>::~dLinkList()
            {
            ????
            //如果堆棧非空,則不斷del第一個元素直到為空
            ????while(!IsEmpty())
            ????{
            ????????del(
            1);
            ????}
            }
            template?
            <class?T>?void?dLinkList<T>::locate(const?int?loc)
            {
            ????
            if(loc<1?||?loc>sum)
            ????{
            ????????cout
            <<"locate?error"<<endl;
            ????}
            else
            ????{
            ????????
            int?curlocdistance=?(curloc-loc>0)?(curloc-loc):(loc-curloc);?//當前位置與loc點距離
            ????????int?rearlocdistance?=?sum-loc;//loc位置與表尾距離
            ????????
            ????????
            //令curpt指向位置loc的節點
            ????????if(?(loc-1<curlocdistance))//loc距離表頭最近 {(loc-1)為loc與表頭的距離}
            ????????{
            ????????????curpt
            =head;
            ????????????
            for(int?i=0;?i<loc-1;i++)
            ????????????????curpt
            =curpt->suclink;
            ????????}
            else?if(?rearlocdistance<loc-1?&&?rearlocdistance?<?curlocdistance)//loc距離表尾最近
            ????????{
            ????????????curpt
            =rear;
            ????????????
            for(int?i=0;i<rearlocdistance;i++)
            ????????????????curpt
            =curpt->prelink;
            ????????}
            else?if(curloc-loc>0)//loc在curloc前面
            ????????{
            ????????????
            for(int?i=0;i<curlocdistance;i++)
            ????????????????curpt
            =curpt->prelink;
            ????????}
            else//loc在curloc后面
            ????????{
            ????????????
            for(int?i=0;i<curlocdistance;i++)
            ????????????????curpt
            =curpt->suclink;
            ????????}
            ????????curloc
            =loc;
            ????}
            ????
            return;
            }
            template?
            <class?T>?void?dLinkList<T>::insert(const?T?&x,int?loc)
            {
            ????
            if(?(loc<1)?||?(loc>sum+1))
            ????{
            ????????cout
            <<"loc?is?out?of?range."<<endl;
            ????????
            return;
            ????}

            ????Element
            <T>*?temp=new?Element<T>;
            ????temp
            ->content=x;

            ????
            if?(sum==0)
            ????{
            ????????temp
            ->prelink=NULL;
            ????????temp
            ->suclink=NULL;
            ????????head
            =temp;
            ????????rear
            =temp;

            ????}
            else?if(loc==sum+1)
            ????{????
            ????????rear
            ->suclink=temp;
            ????????temp
            ->suclink=NULL;
            ????????temp
            ->prelink=rear;
            ????????rear
            =temp;
            ????}
            else?if(loc==1)
            ????{
            ????????temp
            ->prelink=NULL;
            ????????head
            ->prelink=temp;
            ????????temp
            ->suclink=head;
            ????????head
            =temp;

            ????}
            else
            ????{????????
            ????????locate(loc);
            //調用私用成員函數定位
            ????????
            ????????
            //完成鏈接元素重新鏈接
            ????????temp->prelink=curpt->prelink;
            ????????curpt
            ->prelink=temp;
            ????????temp
            ->suclink=curpt;
            ????????temp
            ->prelink->suclink=temp;
            ????????
            //令curpt指向當前插入元素。
            ????}
            ????sum
            ++;????????
            ????curpt
            =temp;
            ????curloc
            =loc;
            ????
            return;
            }
            template?
            <class?T>?void?dLinkList<T>::del(int?loc)
            {
            ????
            if(loc<1?||?loc>sum)
            ????{
            ????????cout
            <<"del?location?error"<<endl;
            ????????
            return;
            ????}
            ????
            if(sum=1)
            ????{
            ????????delete?head;
            ????????head
            =NULL;
            ????????rear
            =NULL;
            ????????curpt
            =NULL;
            ????????curloc
            =0;
            ????????sum
            --;

            ????}
            else?if(loc==1)
            ????{
            ????????curpt
            =head;
            ????????head
            =head->suclink;
            ????????head
            ->prelink=NULL;
            ????????delete?curpt;
            ????????curpt
            =head;
            ????????curloc
            =1;
            ????????sum
            --;
            ????}
            else?if(loc==sum)
            ????{
            ????????curpt
            =rear;
            ????????rear
            =rear->prelink;
            ????????rear
            ->suclink=NULL;
            ????????delete?curpt;
            ????????curpt
            =rear;
            ????????curloc
            =sum-1;
            ????????sum
            --;
            ????}
            else
            ????{
            ????????locate(loc);
            ????????curpt
            ->prelink->suclink=curpt->suclink;
            ????????curpt
            ->suclink->prelink=curpt->prelink;
            ????????curpt
            =curpt->suclink;
            ????????curloc
            =loc;
            ????????sum
            --;
            ????}
            ????
            return;
            }

            template?
            <class?T>?void?dLinkList<T>::modify(const?T?&x,int?loc)
            {
            ????
            if(loc<1?||?loc>sum)
            ????{
            ????????cout
            <<"modify?location?error"<<endl;
            ????????
            return;
            ????}
            ????locate(loc);
            ????curpt
            ->content=x;
            }

            template?
            <class?T>?bool?dLinkList<T>::IsEmpty()
            {
            ????
            return?(!sum);
            }
            template?
            <class?T>?T?dLinkList<T>::get(int?loc)
            {
            ????
            if(loc<1?||?loc>sum)
            ????{
            ????????cout
            <<"get?location?error"<<endl;
            ????????
            return?NULL;
            ????}
            ????locate(loc);
            ????
            return?curpt->content;
            }

            template?
            <class?T>?int?dLinkList<T>::search(const?T?&x,const?int?startloc=1)
            {
            ????
            if(startloc<1?||?startloc>sum)
            ????{
            ????????cout
            <<"search?start?location?error"<<endl;
            ????????
            return;
            ????}
            ????locate(startloc);
            ????
            while(curpt->content!=x)
            ????{
            ????????
            if(curpt->suclink==NULL)
            ????????{
            ????????????
            return?0;
            ????????}
            ????????curpt
            =curpt->suclink;
            ????????curloc
            ++;
            ????}
            ????
            return?curloc;
            }
            template?
            <class?T>?int?dLinkList<T>::getsum()
            {
            ????
            return?sum;
            }

            #endif?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?

            Feedback

            # re: 雙鏈表模版類的實現  回復  更多評論   

            2006-05-08 13:05 by 小明
            一點淺見。

            using namespace std;
            最好不要在頭文件中using namespace,這樣使用你的頭文件的人被迫也
            using namespace std了
            這樣用好了:std::cout

            另外你使用std::cout,那么GUI的程序就不能看到任何訊息。總之不通用。

            設計一個良好的類考慮的問題應該更全面一點





            # re: 雙鏈表模版類的實現  回復  更多評論   

            2006-05-08 13:22 by 音樂蟲子
            庫開發者和一般使用者要考慮的問題差別很大。

            # re: 雙鏈表模版類的實現  回復  更多評論   

            2006-05-08 18:54 by Tauruser
            @小明
            謝謝指點。
            另外想問一下,我想把出錯信息返回來給調用用戶的話,應該如果做才好呢?
            上面的模板,我只考慮了在console下執行,所以用到了std::cout;

            # re: 雙鏈表模版類的實現  回復  更多評論   

            2006-05-08 19:29 by iceboundrock
            如果是類庫,直接就把錯誤信息作為異常拋出去。

            # re: 雙鏈表模版類的實現  回復  更多評論   

            2007-04-09 01:32 by 踏雪赤兔
            與一般的實現想比,文中的“定位方法”比較有新意,不過寫得太冗長了,想一想,如何精簡一下,同時提高可讀性。

            # re: 雙鏈表模版類的實現  回復  更多評論   

            2011-09-26 15:14 by 周曉榮
            問下:關于查找(search)那部分,我有點小問題要問,就是你直接就靠默認的比較操作符來比較,而你所用的是模版,鏈表支持各種類型,那么是字符串類型的鏈表或自定義類型的呢,你該怎么辦
            精品人妻伦九区久久AAA片69| 区久久AAA片69亚洲| 久久久无码精品亚洲日韩蜜臀浪潮| 久久综合九色综合欧美狠狠| 久久夜色精品国产噜噜亚洲AV| 亚洲欧美成人久久综合中文网| 国产L精品国产亚洲区久久| 91超碰碰碰碰久久久久久综合| 久久综合九色综合精品| 国产精品va久久久久久久| 久久91精品国产91久久户| 高清免费久久午夜精品| 一级做a爰片久久毛片16| 91精品国产高清久久久久久91| 天天爽天天爽天天片a久久网| 色综合久久88色综合天天| 精品国产乱码久久久久久浪潮| 国产精品伦理久久久久久| 色综合合久久天天给综看| 色天使久久综合网天天| 久久精品中文闷骚内射| 久久99热狠狠色精品一区| 久久AAAA片一区二区| 久久人人爽人人爽人人片AV高清| 中文字幕乱码久久午夜| 久久久久国产一级毛片高清版| 久久久无码精品午夜| 一本一道久久综合狠狠老| 91久久精品国产免费直播| 青青青青久久精品国产h久久精品五福影院1421 | 久久久久久久人妻无码中文字幕爆| 国产∨亚洲V天堂无码久久久| 国产成人精品久久一区二区三区av| 人妻丰满?V无码久久不卡| 久久av无码专区亚洲av桃花岛| 青青草原综合久久| 久久人与动人物a级毛片| 岛国搬运www久久| 日韩精品久久无码中文字幕| 国产精品免费久久久久久久久| 亚洲va久久久噜噜噜久久|