From 13b39d7b1b001d9f2a4ec4e74f3711a8f5c9c78e Mon Sep 17 00:00:00 2001 From: sauron Date: Sat, 11 Oct 2025 22:25:36 +0900 Subject: [PATCH] commit 2025-10-11 22:25 add ZtCLinkList::SwapLink() : ZCppMain/ZtCLinkList.H --- ZCppMain/ZtCLinkList.H | 211 +++++++++++++++++++++++++++++++++++++++ ZCppMainTest/ZtCLinkList_001.cpp | 18 ++++ 2 files changed, 229 insertions(+) diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 9c20cdc..d68e99f 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -1747,6 +1747,38 @@ namespace ZNsMain ZCDataOpt GetObjOpt(TypeSize AI_Index)*/ + ZCLink& HeadRef(){return *mp_HeadLink;} + ZCLink& TailRef(){return *mp_TailLink;} + + ZCLink& HeadRef(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;} + ZCLink& TailRef(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;} + + const ZCLink& HeadRef() const{return *mp_HeadLink;} + const ZCLink& TailRef() const{return *mp_TailLink;} + + const ZCLink& HeadRef(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;} + const ZCLink& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} + + + + ZCLinkOpt HeadOpt(){return ZCLinkOpt(mp_HeadLink);} + ZCLinkOpt TailOpt(){return ZCLinkOpt(mp_TailLink);} + + ZCLinkOpt HeadOpt(TypeSize AI_Distance) + {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} + ZCLinkOpt TailOpt(TypeSize AI_Distance) + {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} + + const ZCLinkOpt HeadOpt() const{return ZCLinkOpt(mp_HeadLink);} + const ZCLinkOpt TailOpt() const{return ZCLinkOpt(mp_TailLink);} + + const ZCLinkOpt HeadOpt(TypeSize AI_Distance) const + {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} + const ZCLinkOpt TailOpt(TypeSize AI_Distance) const + {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} + + + ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); } ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); } @@ -1879,6 +1911,185 @@ namespace ZNsMain #######################################################################*/ + TypeThis& SwapLinkNext(ZCLink& AR_LinkPrev) + { + // 다음 링크와 위치를 맞바꾼다. + + if(size()<=1){return *this;} + + + ZCLink* VP_LinkNext = AR_LinkPrev.mp_NextLink; + + if(&AR_LinkPrev == VP_LinkNext){ return *this; } + + if(size()==2) + { + if(&AR_LinkPrev==mp_HeadLink) /*************************/ + { + // VP_LinkNext==mp_TailLink + + mp_HeadLink = VP_LinkNext ; + mp_TailLink = &AR_LinkPrev; + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + else // VP_LinkNext==mp_HeadLink + { + mp_HeadLink = &AR_LinkPrev ; + mp_TailLink = VP_LinkNext ; + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + } + else if(&AR_LinkPrev==mp_HeadLink) + { + // VP_LinkNext == mp_HeadLink.mp_NextLink; + + ZCLink* VP_HeadNext2 = + VP_LinkNext->mp_NextLink ; + + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev); + ZCLink::JoinLink(&AR_LinkPrev, VP_HeadNext2); + ZCLink::MakeRing(VP_LinkNext , mp_TailLink ); + + mp_HeadLink = VP_LinkNext ; + } + else if(&AR_LinkPrev==mp_TailLink) + { + // VP_LinkNext==mp_HeadLink + + ZCLink* VP_HeadNext = + mp_HeadLink->mp_NextLink ; + ZCLink* VP_TailPrev = + mp_TailLink->mp_PrevLink ; + + ZCLink::JoinLink(mp_TailLink, VP_HeadNext); + ZCLink::JoinLink(VP_TailPrev, mp_HeadLink); + ZCLink::MakeRing(mp_TailLink, mp_HeadLink); + + mp_HeadLink = &AR_LinkPrev ; + mp_TailLink = VP_LinkNext ; + } + else if(VP_LinkNext==mp_TailLink) + { + ZCLink* VP_TailPrev2 = + AR_LinkPrev.mp_PrevLink ; + + ZCLink::JoinLink(VP_TailPrev2, VP_LinkNext ); + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ); + ZCLink::MakeRing(mp_HeadLink , &AR_LinkPrev ); + + mp_TailLink = &AR_LinkPrev ; + } + else + { + ZCLink* VP_SwapPrev = AR_LinkPrev. mp_PrevLink; + ZCLink* VP_SwapNext = VP_LinkNext->mp_NextLink; + + ZCLink::JoinLink(VP_SwapPrev , VP_LinkNext ) ; + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ) ; + ZCLink::JoinLink(&AR_LinkPrev, VP_SwapNext ) ; + } + return *this; /***********************************/ + }/* + TypeThis& SwapLinkNext(ZCLink& AR_LinkPrev)*/ + + TypeThis& SwapLinkPrev(ZCLink& AR_LinkNext) + { + // 이전 링크와 위치를 맞바꾼다. + + return SwapLinkNext(*AR_LinkNext.mp_PrevLink); + }/* + TypeThis& SwapLinkPrev(ZCLink& AR_LinkNext)*/ + + + TypeThis& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo) + { + // AR_LinkOne 와 AR_LinkTwo 의 위치를 바꾼다. + + if(size()<=1){return *this;} + + if(&AR_LinkOne==&AR_LinkTwo){return *this;} + + if(&AR_LinkOne==mp_HeadLink && &AR_LinkTwo==mp_TailLink) + { return SwapLinkNext(AR_LinkTwo); } + if(&AR_LinkOne==mp_TailLink && &AR_LinkTwo==mp_HeadLink) + { return SwapLinkNext(AR_LinkOne); } + /******************************************************/ + if(&AR_LinkTwo==AR_LinkOne.mp_NextLink) + { return SwapLinkNext(AR_LinkOne); } + if(&AR_LinkOne==AR_LinkTwo.mp_NextLink) + { return SwapLinkNext(AR_LinkTwo); } + /******************************************************/ + + if(&AR_LinkOne==mp_HeadLink) + { + ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; + ZCLink* VP_TwoNext =AR_LinkTwo. mp_NextLink; + ZCLink* VP_TwoPrev =AR_LinkTwo. mp_PrevLink; + + ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; + ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext ) ; + ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; + + mp_HeadLink = &AR_LinkTwo ; return *this; + } + if(&AR_LinkOne==mp_TailLink) + { + ZCLink* VP_TailPrev= mp_TailLink->mp_PrevLink; + ZCLink* VP_TwoNext = AR_LinkTwo. mp_NextLink; + ZCLink* VP_TwoPrev = AR_LinkTwo. mp_PrevLink; + + ZCLink::JoinLink( VP_TwoPrev , &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne , VP_TwoNext ) ; + ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; + ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; + + mp_TailLink = &AR_LinkTwo ; return *this; + } + /******************************************************/ + if(&AR_LinkTwo==mp_HeadLink) + { + ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; + ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; + ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; + + ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; + ZCLink::JoinLink( VP_OnePrev, &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne, VP_OneNext ) ; + ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; + + mp_HeadLink = &AR_LinkTwo ; return *this; + } + if(&AR_LinkTwo==mp_TailLink) + { + ZCLink* VP_TailPrev=mp_TailLink->mp_PrevLink; + ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; + ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; + + ZCLink::JoinLink( VP_OnePrev , &AR_LinkTwo ) ; + ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext ) ; + ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; + ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; + + mp_TailLink = &AR_LinkTwo ; return *this; + } + /********************************************************/ + + ZCLink* VP_OnePrev= AR_LinkOne.mp_PrevLink ; + ZCLink* VP_OneNext= AR_LinkOne.mp_NextLink ; + ZCLink* VP_TwoPrev= AR_LinkTwo.mp_PrevLink ; + ZCLink* VP_TwoNext= AR_LinkTwo.mp_NextLink ; + + ZCLink::JoinLink( VP_OnePrev, &AR_LinkTwo) ; + ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext) ; + ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne) ; + ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext) ; return *this; + }/* + TypeThis& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/ + + + TypeThis& CopyThis(TypeThis& ARR_Rhs) const { // *this 를 복사해서, ARR_Rhs 의 끝에 연결한다. diff --git a/ZCppMainTest/ZtCLinkList_001.cpp b/ZCppMainTest/ZtCLinkList_001.cpp index e9c4517..bfa2fe5 100644 --- a/ZCppMainTest/ZtCLinkList_001.cpp +++ b/ZCppMainTest/ZtCLinkList_001.cpp @@ -226,6 +226,24 @@ namespace ZNsMain VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0)); cout<<"***********************************************"<