• <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 閱讀(1716) 評論(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)那部分,我有點小問題要問,就是你直接就靠默認的比較操作符來比較,而你所用的是模版,鏈表支持各種類型,那么是字符串類型的鏈表或自定義類型的呢,你該怎么辦
            国产精品成人精品久久久 | 亚洲中文久久精品无码| 久久久久久久亚洲精品| 亚洲?V乱码久久精品蜜桃| 亚州日韩精品专区久久久| 久久久久成人精品无码中文字幕| 久久精品国产亚洲77777| 国产精品激情综合久久| 狠狠色噜噜色狠狠狠综合久久| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久亚洲AV成人无码国产| 国产99精品久久| 久久无码专区国产精品发布| 99久久成人国产精品免费| 亚洲人成无码网站久久99热国产| 国产精品久久久久国产A级| 亚洲精品tv久久久久| 欧美一区二区精品久久| 人妻精品久久久久中文字幕69 | 亚洲国产精品狼友中文久久久 | 久久综合一区二区无码| 国产精品久久久久aaaa| 久久久久亚洲AV无码专区首JN| 久久婷婷久久一区二区三区| 99久久国产综合精品女同图片| 成人精品一区二区久久久| 国内精品久久久久久99蜜桃| 99久久99久久精品国产片果冻 | 久久久久人妻一区二区三区| yellow中文字幕久久网| 精品精品国产自在久久高清| 久久久国产乱子伦精品作者 | 久久99国产精一区二区三区 | 久久精品国产亚洲5555| 国产精品久久国产精麻豆99网站| 久久久久亚洲精品天堂| 久久99国产乱子伦精品免费| 99国产欧美久久久精品蜜芽| 国产精品99久久精品| 久久99国产精品久久久| 97久久精品人人澡人人爽|