• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            在模版類(lèi)加入curpt與curloc兩個(gè)變量加速對(duì)鏈表的定位
            #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;//當(dāng)前指針
            ????int?curloc;//當(dāng)前指針位置
            ????int?sum;//鏈表元素總數(shù)
            ????
            };


            template?
            <class?T>?dLinkList<T>::dLinkList()
            {
            ????head
            =NULL;
            ????rear
            =NULL;
            ????curpt
            =NULL;
            ????curloc
            =0;
            ????sum
            =0;
            }
            template?
            <class?T>?dLinkList<T>::~dLinkList()
            {
            ????
            //如果堆棧非空,則不斷del第一個(gè)元素直到為空
            ????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);?//當(dāng)前位置與loc點(diǎn)距離
            ????????int?rearlocdistance?=?sum-loc;//loc位置與表尾距離
            ????????
            ????????
            //令curpt指向位置loc的節(jié)點(diǎn)
            ????????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);
            //調(diào)用私用成員函數(shù)定位
            ????????
            ????????
            //完成鏈接元素重新鏈接
            ????????temp->prelink=curpt->prelink;
            ????????curpt
            ->prelink=temp;
            ????????temp
            ->suclink=curpt;
            ????????temp
            ->prelink->suclink=temp;
            ????????
            //令curpt指向當(dāng)前插入元素。
            ????}
            ????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: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2006-05-08 13:05 by 小明
            一點(diǎn)淺見(jiàn)。

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

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

            設(shè)計(jì)一個(gè)良好的類(lèi)考慮的問(wèn)題應(yīng)該更全面一點(diǎn)





            # re: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2006-05-08 13:22 by 音樂(lè)蟲(chóng)子
            庫(kù)開(kāi)發(fā)者和一般使用者要考慮的問(wèn)題差別很大。

            # re: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2006-05-08 18:54 by Tauruser
            @小明
            謝謝指點(diǎn)。
            另外想問(wèn)一下,我想把出錯(cuò)信息返回來(lái)給調(diào)用用戶的話,應(yīng)該如果做才好呢?
            上面的模板,我只考慮了在console下執(zhí)行,所以用到了std::cout;

            # re: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2006-05-08 19:29 by iceboundrock
            如果是類(lèi)庫(kù),直接就把錯(cuò)誤信息作為異常拋出去。

            # re: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2007-04-09 01:32 by 踏雪赤兔
            與一般的實(shí)現(xiàn)想比,文中的“定位方法”比較有新意,不過(guò)寫(xiě)得太冗長(zhǎng)了,想一想,如何精簡(jiǎn)一下,同時(shí)提高可讀性。

            # re: 雙鏈表模版類(lèi)的實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            2011-09-26 15:14 by 周曉榮
            問(wèn)下:關(guān)于查找(search)那部分,我有點(diǎn)小問(wèn)題要問(wèn),就是你直接就靠默認(rèn)的比較操作符來(lái)比較,而你所用的是模版,鏈表支持各種類(lèi)型,那么是字符串類(lèi)型的鏈表或自定義類(lèi)型的呢,你該怎么辦
            jizzjizz国产精品久久| 日本WV一本一道久久香蕉| 九九久久精品无码专区| 久久香蕉国产线看观看乱码| 久久狠狠高潮亚洲精品| 欧美精品一区二区精品久久| 97超级碰碰碰碰久久久久| 青青草原综合久久大伊人| 一本久久a久久精品亚洲| 国产综合成人久久大片91| 久久久久人妻精品一区三寸蜜桃 | 久久无码一区二区三区少妇 | 久久夜色精品国产噜噜麻豆| segui久久国产精品| 久久久久亚洲AV无码永不| 国产精品成人无码久久久久久 | 亚洲欧美日韩中文久久| 日本三级久久网| 久久婷婷人人澡人人爽人人爱| 久久国产成人午夜AV影院| 成人亚洲欧美久久久久| 2020久久精品亚洲热综合一本| 亚洲国产精品一区二区久久| 久久婷婷五月综合成人D啪| 国产激情久久久久影院老熟女免费 | AV无码久久久久不卡网站下载| 久久99国产精品成人欧美| 精品久久久久久国产潘金莲| 人妻无码αv中文字幕久久琪琪布| 精品久久久久国产免费| 久久国产精品99久久久久久老狼 | 久久精品?ⅴ无码中文字幕| 亚洲AV无码久久| 伊人久久精品无码av一区| 亚洲欧美国产精品专区久久| 久久电影网| 国产成人精品久久亚洲高清不卡| 粉嫩小泬无遮挡久久久久久| www久久久天天com| 国产欧美久久久精品| 久久久国产精品福利免费|