• <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)那部分,我有點小問題要問,就是你直接就靠默認的比較操作符來比較,而你所用的是模版,鏈表支持各種類型,那么是字符串類型的鏈表或自定義類型的呢,你該怎么辦
            久久免费香蕉视频| 青青青伊人色综合久久| 久久精品成人| 97精品依人久久久大香线蕉97| 99精品久久久久久久婷婷| 一级A毛片免费观看久久精品| 97精品国产91久久久久久| 久久精品夜色噜噜亚洲A∨| 国产午夜福利精品久久| 伊人久久大香线蕉无码麻豆 | 国产成人久久激情91| 狠狠干狠狠久久| 久久综合香蕉国产蜜臀AV| 久久久亚洲精品蜜桃臀| 伊人久久大香线蕉亚洲| 亚洲国产精品久久66| 精品亚洲综合久久中文字幕| 久久精品国产WWW456C0M| 中文字幕无码久久精品青草| 99久久综合狠狠综合久久止| 久久中文字幕无码专区| 精品久久久久久国产潘金莲| 无码日韩人妻精品久久蜜桃 | 久久综合九色综合精品| 久久亚洲精品无码aⅴ大香| 日本精品一区二区久久久| 久久e热在这里只有国产中文精品99| 久久久久久久久66精品片| 色综合久久中文字幕综合网| 国产精品免费看久久久| 狠狠色噜噜色狠狠狠综合久久| 久久久久99精品成人片| 久久精品国产99国产精品澳门| 国产精品久久久久久五月尺| 久久精品国产精品亚洲艾草网美妙| 久久精品毛片免费观看| 久久99国产精品二区不卡| 色婷婷久久综合中文久久蜜桃av| 蜜臀久久99精品久久久久久| 国产精品久久久久久久久久免费| 精品久久久久香蕉网|