• <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>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間)

            // ?IntLink.cpp?:?Defines?the?entry?point?for?the?console?application.
            //
            //
            /**/ //////////////////////////////////////////////////////////////////////// //
            // 作者:夢(mèng)在天涯
            // 單向鏈表類
            /**/ //////////////////////////////////////////////////////////////////////// //
            //
            //
            #pragma?once
            #include?
            < stdio.h >
            #include?
            < tchar.h >

            #include?
            < iostream >
            using ? namespace ?std;

            struct ?NODE
            {
            ???
            int ?data;
            ???NODE?
            * ?next;
            }
            ;
            class ?CIntLink
            {
            private :
            ????NODE?
            * ?head;
            public :
            ????CIntLink()
            ????
            {
            ????????head
            = NULL;
            ????}

            ????
            ~ CIntLink()
            ????
            {
            ????????delete?head;
            ????}

            ??
            void ?Add(? int ?iValue?);
            ??
            void ??Remove(? int ?iIndex);
            ??
            void ???Insert( int ?iIndex,? int ?iValue?);
            ??
            int ??Find(? int ?iValue?);
            ??
            void ?output();
            ??
            int ?size();
            }
            ;
            // 鏈表的標(biāo)號(hào)是從0開始。且第一個(gè)節(jié)點(diǎn)有存有數(shù)據(jù)。
            void ??CIntLink::Add( int ?ivalue)
            {
            ????
            if (head == NULL)
            ????
            {
            ???????head
            = new ?NODE;
            ???????head
            -> data = ivalue;
            ???????head
            -> next = NULL;
            ????}

            ????
            else
            ????
            {
            ???NODE?
            * temp = new ?NODE;
            ???temp
            -> data = ivalue;
            ???temp
            -> next = NULL;
            ???NODE?
            * p = head;
            ???
            while (p -> next != NULL)
            ?????????p
            = p -> next;
            ???p
            -> next = temp;
            ????}

            ??
            }

            void ?CIntLink::Remove( int ?iIndex)???? // iIndex?從0開始,即第一個(gè)值也即頭指針為iIndex為0
            {
            ????
            if (iIndex == 0 )
            ????
            {
            ????????NODE?
            * ?p = head;
            ???????head
            = head -> next;
            ????????delete?p;
            ????????p
            = NULL;
            ????}

            ????
            else ? if (iIndex == 1 )
            ????
            {
            ????????NODE?
            * ?p2 = head -> next;
            ????????head
            -> next = p2 -> next;
            ????????delete?p2;
            ????????p2
            = NULL;
            ????}

            ????
            else
            ????
            {?
            ????????NODE?
            * pre = head -> next;
            ????????NODE?
            * p = pre -> next;
            ??????
            ???????
            for ( int ?i = 2 ;p != NULL;i ++ )?? // p?為要?jiǎng)h除的值的位置
            ??????? {??????
            ????????
            if ?(iIndex == i)?? break ;
            ????????pre
            = p;p = p -> next;
            ???????}

            ???????
            if (iIndex == i && p != NULL)
            ???????
            {
            ???????????pre
            -> next = p -> next;
            ??????????delete?p;
            ??????????p
            = NULL;
            ??????}

            ??????
            else ???????????????????????? // p->NULL
            ?????? {
            ??????????cout
            << " remove?fail:no?fond?iIndex " << endl;
            ??????}

            ???}

            }

            ?
            void ?CIntLink::Insert( int ?iIndex,? int ?iValue)
            {
            ????
            if (iIndex == 0 )
            ????
            {
            ????????NODE?
            * ?p1 = new ?NODE;
            ????????p1
            -> data = iValue;
            ????????p1
            -> next = head;
            ????????head
            = p1;
            ????}

            ????
            else ? if (iIndex == 1 )
            ????
            {
            ????????NODE?
            * ?p2 = new ?NODE;
            ????????p2
            -> data = iValue;
            ????????p2
            -> next = head -> next;
            ????????head
            -> next = p2;
            ????}

            ????
            else
            ????
            {
            ????????NODE?
            * pre = head -> next;
            ????????NODE?
            * pp = pre -> next;
            ????????
            ????????
            for ( int ?i = 2 ;pp != NULL;i ++ )?? // i為要插入的值的位置
            ???????? {
            ????????????
            if ?(iIndex == i)?? break ;
            ????????????pre
            = pp;pp = pp -> next;

            ????????}

            ????????
            if (iIndex == i && pp != NULL)?
            ????????
            {
            ????????????NODE?
            * q = new ?NODE;
            ????????????q
            -> data = iValue;
            ????????????q
            -> next = pp -> next;
            ????????????pre
            -> next = q;
            ????????????q
            -> next = pp;

            ????????}

            ?????????
            else ??????????????? // (pp->next=NULL)
            ???????? {
            ????????????cout
            << " insert?fail:iIndex?is?out?of?range? " << endl;
            ????????}

            ????
            ????}

            }

            int ??CIntLink::Find( int ?iValue)
            ?
            {
            ?????
            if (head == NULL)
            ?????
            {
            ?????????cout
            << " find?fail:no?found?ivalue?,and?it?retrun?is?-1 " << endl;
            ?????????
            return ? - 1 ;
            ?????}

            ?????NODE?
            * pp = ?head;
            ????
            for ( int ?i = 0 ;pp -> next != NULL;i ++ )
            ??????
            if (pp -> data == iValue)
            ??????
            {
            ???????
            return ?i; // --i;
            ??????}
            ?
            ??????
            else
            ???????pp
            = pp -> next;

            ????cout
            << " find?fail:no?found?ivalue,and?it?return?is?-1 " << endl;?
            ????
            return ? - 1 ;
            ??????
            }

            ?
            void ?CIntLink::output()
            ?
            {
            ?????NODE?
            * ?p = head;
            ?????cout
            << " the?link?data?is?: " << endl;
            ?????
            for (;p != NULL;p = p -> next)
            ?????????cout
            << p -> data << endl;
            ?}

            ?
            int ?CIntLink::size()
            ?
            {
            ?????NODE?
            * ?p = head;
            ?????
            int ?i = 0 ;
            ?????
            for (?;p != NULL;p = p -> next,i ++ );
            ?????
            return ?i;
            ?????????
            ?}

            int ?_tmain( int ?argc,?_TCHAR * ?argv[])
            {
            ????CIntLink?link;
            ????link.Add(
            10 );
            ????link.Add(
            30 );
            ????link.Add(
            40 );
            ????link.Add(
            50 );
            ????link.Insert(
            5 , 20 );
            ????link.Remove(
            5 );
            ????
            int ?num = link.size();
            ????cout
            << " the?link?data?number?is?: " << num << endl;
            ????link.output();
            ????
            int ?re = link.Find( 20 );
            ????cout
            << re << endl;
            ?
            ????
            return ? 0 ;
            }
            以上的析構(gòu)函數(shù),應(yīng)該先判斷為NULL,再delete.

            別人寫的:
            #ifndef?LIST_H
            #define?LIST_H
            template
            <typename?elemtype>class?list_item?
            {
            public:
            ?list_item(?elemtype,?list_item
            <elemtype>*?);
            ?list_item(?
            const?list_item<elemtype>&?);

            ?
            const?elemtype?date?()?const;
            ?
            const?list_item<elemtype>*?next()?const;?
            ?
            void?get_date?(?const?elemtype?);
            ?
            void?get_next?(?const?list_item<elemtype>*?);

            ?
            void?operator?=(?const?list_item<elemtype>&?);
            private:
            ?elemtype??_date;
            ?list_item
            <elemtype>?*_next;?
            }
            ;//單鏈表數(shù)據(jù)項(xiàng)類

            //數(shù)據(jù)項(xiàng)類代碼實(shí)現(xiàn)
            template<typename?elemtype>
            ?list_item
            <elemtype>::list_item(?elemtype?ia?=?0,
            ???????list_item
            <elemtype>?*p?=?0?)?
            ?
            {
            ???get_date(?ia?);
            ???
            if(?p?==?NULL?)
            ????get_next(?NULL?);
            ???
            else?
            ???
            {
            ????get_next(?p
            ->next()?);
            ????p
            ->get_next(?this?);
            ???}

            ??}

            template
            <typename?elemtype>
            ?
            const?elemtype?
            ?list_item
            <elemtype>::date()?const?
            ?
            {
            ??
            return?_date;
            ?}

            template
            <typename?elemtype>?const?
            ?list_item
            <elemtype>*?list_item<elemtype>::
            ?next()?
            const??
            ?
            {?
            ??
            return?_next;
            ?}

            template
            <typename?elemtype>
            ?
            void?list_item<elemtype>::get_date(?const?elemtype?de?)
            ?
            {
            ??_date?
            =?de;?
            ?}

            template
            <typename?elemtype>
            ?
            void?list_item<elemtype>::
            ?get_next(?
            const?list_item<elemtype>?*pev?)
            ?
            {?
            ??_next?
            =?(?list_item<elemtype>*?)pev;?
            ?}


            template
            <typename?elemtype>?class?list
            {
            public:
            ?list();
            ?list(?
            const?list<elemtype>&?);
            ?
            ~list();

            ?
            const?int?size()?const;
            ?
            const?bool?empty()?const;
            ?
            void?insert(?const?elemtype,?const?elemtype?);
            ?
            void?insert_front(?const?elemtype?);
            ?
            void?insert_end(?const?elemtype?);
            ?
            void?remove(?const?elemtype?);
            ?
            void?remove_all();
            ?
            void?remove_front();
            ?
            void?print()?const;
            ?
            const?list_item<elemtype>*?find(?const?elemtype?);

            ?
            void?operator?=(?const?list<elemtype>&?);

            private:
            ?
            //
            ?void?down_size();
            ?
            void?add_size();

            ?
            //
            ?list_item<elemtype>?*at_front;
            ?list_item
            <elemtype>?*at_end;
            ?list_item
            <elemtype>?*at_move;
            ?
            int???????????????_size;
            }
            ;//鏈表類定義

            //函數(shù)實(shí)現(xiàn)代碼
            //私有函數(shù)集合
            template<typename?elemtype>?
            ?
            void?list<elemtype>::add_size()?
            ?
            {
            ??
            ++_size;?
            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::down_size()?
            ?
            {
            ??
            --_size;?
            ?}


            //公有函數(shù)集合
            template<typename?elemtype>
            ?list
            <elemtype>::list()?{?
            ??at_front?
            =?NULL;
            ??at_end?
            =?NULL;
            ??_size?
            =?0;
            ?}

            template
            <typename?elemtype>
            ?list
            <elemtype>::~list()?
            ?
            {
            ??remove_all();
            ?}

            template
            <typename?elemtype>
            ?
            const?bool?list<elemtype>::empty()?const
            ?
            {
            ??
            return?size()?==?0???false?:?true;
            ?}

            template
            <typename?elemtype>
            ?
            const?int?list<elemtype>::size()?const
            ?
            {?
            ??
            return?_size;
            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::insert_front(?const?elemtype?iva?)
            ?
            {
            ??list_item
            <elemtype>?*pv?=?
            ????
            new?list_item<elemtype>(?iva,?0?);
            ??
            if(?!at_front?)
            ??
            {
            ???at_front?
            =?at_end?=?pv;
            ??}

            ??
            else?
            ??
            {
            ???pv
            ->get_next(?at_front?);
            ???at_front?
            =?pv;
            ??}

            ??add_size();
            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::insert_end(?const?elemtype?iva?)?
            ?
            {
            ??
            if(?at_end?==?NULL)?
            ??
            {
            ???at_end?
            =?at_front?=
            ?????
            new?list_item<elemtype>(?iva,?0?);
            ??}

            ??
            else?
            ???at_end?
            =?new?list_item<elemtype>(?iva,?at_end?);?
            ??add_size();
            ?}

            template
            <typename?elemtype>?void?list<elemtype>::
            ?insert(?
            const?elemtype?ixa,?const?elemtype?iva?)?
            ?
            {
            ??list_item
            <elemtype>?*pev?=?
            ????(?list_item
            <elemtype>*?)find(?iva?);
            ??
            if(?pev?==?NULL?)
            ??
            {
            ???cerr?
            <<?"err!"?<<endl;
            ???
            return;
            ??}

            ??
            if(?pev?==?at_front?)?
            ???insert_front(?ixa?);
            ??
            else?{
            ???
            new?list_item<elemtype>(?ixa,?pev?);
            ???add_size();
            ??}

            ?}

            template
            <typename?elemtype>?const?
            list_item
            <elemtype>*?list<elemtype>::
            ?find(?
            const?elemtype?iva?)
            ?
            {
            ??list_item
            <elemtype>?*at_move?=?at_front;
            ??
            while(?at_move?!=?NULL?)?
            ??
            {
            ???
            if(?at_move->date()?==?iva?)
            ????
            return?at_move;
            ???at_move?
            =?(?list_item<elemtype>*?)at_move->next();
            ??}

            ???
            return?NULL;
            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::remove_front()
            ?
            {
            ??
            if(?at_front?)
            ??
            {
            ???list_item
            <elemtype>?*pev?=?at_front;
            ???at_front?
            =?(?list_item<elemtype>*?)at_front->next();
            ???delete?pev;
            ???down_size();
            ??}

            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::remove(?elemtype?iva?)
            ?
            {
            ??list_item
            <elemtype>?*pev?=?at_front;
            ??
            while(?pev?&&?pev->date()?==?iva?)
            ??
            {
            ???pev?
            =?(?list_item<elemtype>*?)pev->next();
            ???remove_front();
            ??}

            ??
            if(?!pev?)
            ???
            return?;
            ??list_item
            <elemtype>?*prv?=?pev;
            ??pev?
            =?(?list_item<elemtype>*?)pev->next();
            ??
            while(?pev?)?
            ??
            {
            ???
            if(?pev->date()?==?iva?)?
            ???
            {
            ????prv
            ->get_next(?pev->next()?);???
            ????down_size();
            ????delete?pev;
            ????pev?
            =?(?list_item<elemtype>*?)prv->next();
            ????
            if(?pev?!=?NULL?)
            ????
            {
            ?????at_end?
            =?prv;
            ?????
            return;
            ????}

            ???}

            ???
            else?
            ???
            {
            ????prv?
            =?pev;
            ????pev?
            =?(?list_item<elemtype>*?)pev->next();
            ???}

            ??}

            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::remove_all()
            ?
            {
            ??
            while(?at_front?)
            ???remove_front();
            ??_size?
            =?0;
            ??at_front?
            =?at_end?=?NULL;
            ?}

            template
            <typename?elemtype>
            ?
            void?list<elemtype>::print()?const?
            ?
            {
            ??list_item
            <elemtype>?*pev?=?at_front;
            ??cout?
            <<?'['?<<?size()?<<?']';
            ??cout?
            <<?'{';
            ??
            for(?int?ix?=?0;?pev?&&?ix?<?size();?++ix?)?
            ??
            {
            ???cout?
            <<?pev->date()?<<?'?';
            ???pev?
            =?(?list_item<elemtype>*?)pev->next();
            ??}

            ??cout?
            <<?'}'?<<?endl;
            ?}

            #endif

            posted on 2005-10-28 08:42 夢(mèng)在天涯 閱讀(2453) 評(píng)論(6)  編輯 收藏 引用 所屬分類: CPlusPlusData Arithmetic

            評(píng)論

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-11-02 08:12 懷沙

            應(yīng)該要有拷貝構(gòu)造函數(shù)哦,否則在進(jìn)行
            CIntLink link2(link);
            這樣的操作時(shí)只會(huì)復(fù)制頭結(jié)點(diǎn)的指針,而不是重新初始化一個(gè)鏈表哦  回復(fù)  更多評(píng)論   

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-11-02 17:28 magician

            樓上說(shuō)的還可以,如果為了使程序更加我完善,有健壯性,我還是喜歡用template<class T>
            的方式來(lái)創(chuàng)建一個(gè)連表,  回復(fù)  更多評(píng)論   

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-11-03 16:19 夢(mèng)在天涯

            樓上的樓上說(shuō)的拷貝構(gòu)造函數(shù)是不是每個(gè)節(jié)點(diǎn)都的重新new,啊?  回復(fù)  更多評(píng)論   

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-11-15 16:35 yanfei

            請(qǐng)問采用template<class T>的方式有什么好處呢?
              回復(fù)  更多評(píng)論   

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-12-10 00:10 寒曙

            好處當(dāng)然是不言自明咯,算法嚴(yán)謹(jǐn),安全,可重用性高……
              回復(fù)  更多評(píng)論   

            # re: c++單向鏈表 (討論應(yīng)不應(yīng)該在默認(rèn)的構(gòu)造里就分配空間) 2005-12-29 12:34 nanami

            構(gòu)造拷貝應(yīng)該進(jìn)行值拷貝。僅僅拷貝外部變量指針,在C++中極易造成內(nèi)存泄漏,構(gòu)成安全隱患。

            除非你的程序?qū)π阅芤髽O高,或者你的鏈表長(zhǎng)度極長(zhǎng)(一般>100000項(xiàng),相對(duì)于現(xiàn)在的計(jì)算機(jī)內(nèi)存操作性能,才應(yīng)算做極長(zhǎng),當(dāng)然,實(shí)際情況也要綜合考慮鏈表每一項(xiàng)的長(zhǎng)度。),并且你保證外部變量在此類所生成的實(shí)例的生存周期內(nèi)一直有效,那么僅僅傳遞指針是可以的。 不過(guò)這樣一來(lái),你DEBUG的時(shí)間會(huì)高出N倍,而且極易留下后患。尤其在對(duì)安全性和穩(wěn)定性較高的領(lǐng)域,寧可犧牲些許性能,也要盡量保證安全。

            順便多句嘴,鏈表如果>100000項(xiàng),盡量考慮RedBlackTree或者M(jìn)ap/HashMap,這樣查找的性能比鏈表高的多得多得多得多得多,而插入最末項(xiàng)的性能也并會(huì)不比鏈表慢。尤其如果鏈表需要進(jìn)行按順序插入合適的位置,那么那個(gè)速度- -!我想你看到了,會(huì)以為死機(jī)了。

            單項(xiàng)鏈表,N項(xiàng),查找其中一個(gè)值最大時(shí)間O(N)。而對(duì)于紅黑樹或MAP,最大時(shí)間僅需O(log2(N))次操作,HASHMAP的查找時(shí)間恒定,只和HASH函數(shù)的速度相關(guān)。一般來(lái)說(shuō),對(duì)于極大數(shù)據(jù)結(jié)構(gòu)操作HASHMAP是最理想的。  回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804430
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            久久棈精品久久久久久噜噜| 精品国产VA久久久久久久冰 | www.久久热.com| 久久香蕉国产线看观看乱码| 热久久国产精品| 亚洲中文字幕久久精品无码喷水| 69国产成人综合久久精品| 污污内射久久一区二区欧美日韩| 中文字幕久久波多野结衣av| 国产精品日韩深夜福利久久| 97精品依人久久久大香线蕉97| 久久777国产线看观看精品| 久久狠狠一本精品综合网| 久久亚洲国产成人精品性色| 色偷偷88欧美精品久久久| 久久99热只有频精品8| 久久中文字幕人妻熟av女| 99久久精品国产一区二区蜜芽| 久久99久国产麻精品66| 青青久久精品国产免费看| 久久精品国产亚洲综合色| 日本人妻丰满熟妇久久久久久| 香蕉久久永久视频| 国内精品久久久久久久涩爱| 91精品国产高清91久久久久久| 精品国产乱码久久久久久呢| 一本久久综合亚洲鲁鲁五月天| 激情五月综合综合久久69| 亚洲精品乱码久久久久久按摩| 青青青青久久精品国产h久久精品五福影院1421| 久久99精品国产一区二区三区| 久久99精品久久久久婷婷| 久久狠狠高潮亚洲精品| 久久天天躁狠狠躁夜夜躁2O2O| 久久精品中文字幕大胸| 久久夜色撩人精品国产| 久久本道综合久久伊人| 欧美性猛交xxxx免费看久久久| 国产精自产拍久久久久久蜜 | 欧美伊人久久大香线蕉综合| 午夜精品久久久久成人|