diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 42ab741..aa4ec27 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -1065,7 +1065,7 @@ namespace ZNsMain { // 맨 앞에 삽입. - if(++ml_LinkSize==1) + if(ml_LinkSize==0) { mp_HeadLink = &AR_LinkNew ; mp_TailLink = &AR_LinkNew ; @@ -1081,10 +1081,15 @@ namespace ZNsMain }/* else*/ } + else if(AP_LinkStd==mp_TailLink) + { + ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ; + ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ; + + mp_TailLink = &AR_LinkNew; + } else { - ++ml_LinkSize; - ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ; ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew); @@ -1092,7 +1097,7 @@ namespace ZNsMain }/* else*/ - return AR_LinkNew; + ++ml_LinkSize; return AR_LinkNew; }/* ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ @@ -1106,7 +1111,7 @@ namespace ZNsMain { // 맨 뒤에 삽입. - if(++ml_LinkSize==1) + if(ml_LinkSize==0) { mp_HeadLink = &AR_LinkNew ; mp_TailLink = &AR_LinkNew ; @@ -1122,10 +1127,15 @@ namespace ZNsMain }/* else*/ } + else if(AP_LinkStd==mp_HeadLink) + { + ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink); + ZCLink::MakeRing(&AR_LinkNew, mp_TailLink); + + mp_HeadLink = &AR_LinkNew; + } else { - ++ml_LinkSize; - ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ; ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew); @@ -1133,7 +1143,7 @@ namespace ZNsMain }/* else*/ - return AR_LinkNew; + ++ml_LinkSize; return AR_LinkNew; }/* ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ @@ -1274,6 +1284,93 @@ namespace ZNsMain }/* ZCLink& CutLink(ZCLink& AR_CutLink)*/ + + ZtCLinkList& CutLinkRangeOut /*#######################################*/ + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCLinkList& rhs , + ZCLink* AP_RhsStd + ) + /*#####################################################################*/ + { + /*/////////////////////////////////////////////////////////// + + ■ AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. + AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. + AP_CutHead 의 앞과 AP_CutTail 의 뒤에서 연결 상태를 끊고, + rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면 + 맨 앞에 삽입한다. -- 2025-10-06 09:16 + + ///////////////////////////////////////////////////////////*/ + + if(this==&rhs ) return rhs; + if(ml_LinkSize<1) return rhs; + + if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때. + { + mp_HeadLink=0; + } + else if(&AR_CutHead==mp_HeadLink) // 잘라내려는 링크가 처음 링크를 포함할 때. + { + ZCLink::MakeRing + (mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink); + } + else if(&AR_CutTail==mp_TailLink) // 잘라내려는 링크가 끝 링크를 포함할 때. + { + ZCLink::MakeRing(mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink); + } + else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. + { + ZCLink::JoinLink(AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink); + }/* + else*/ + + ml_LinkSize -= AL_CutSize; + + + if(rhs.size()<1) + { + // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. + + ZCLink::MakeRing(&AR_CutHead, &AR_CutTail); + + rhs.mp_HeadLink = &AR_CutHead ; + rhs.mp_TailLink = &AR_CutTail ; + } + else if(AP_RhsStd==0) // 맨 앞에 삽입. + { + ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink); + ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink); + + rhs.mp_HeadLink = &AR_CutHead; + } + else // AP_RhsStd 의 뒤에 삽입. + { + ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ; + + ZCLink::JoinLink(AP_RhsStd , &AR_CutHead ); + ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext); + + if(AP_RhsStd==rhs.mp_TailLink) + { rhs.mp_TailLink = &AR_CutTail; } + }/* + else*/ + + rhs.ml_LinkSize += AL_CutSize; return rhs; + }/* + ZtCLinkList& CutLinkRangeOut ########################################### + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCLinkList& rhs , + ZCLink* AP_RhsStd + ) + #######################################################################*/ + + /*private:*/ public : @@ -1476,6 +1573,36 @@ namespace ZNsMain void SendOutTail(ZCLink& AR_CutLink, ZtCLinkList& rhs)*/ + ZtCLinkList& SendRangeOutAfter ////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCLinkList& rhs , + ZCObjOpt AO_ObjOpt + ) + /*#####################################################################*/ + { + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + return CutLinkRangeOut + ( + AR_CutHead, AR_CutTail, AI_CutSize, rhs, + ( bool(AO_ObjOpt) ? &AO_ObjOpt.value() : 0 ) + ); + ////////////////////// + }/* + ZtCLinkList& SendRangeOutAfter ////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCLinkList& rhs , + ZCObjOpt AO_ObjOpt + ) + /*#####################################################################*/ + + template void IterElement(TFunctor AO_Functor) { ZCLink* VP_LoopLink=mp_HeadLink; diff --git a/ZCppMainTest/ZtCLinkList_000.cpp b/ZCppMainTest/ZtCLinkList_000.cpp index b62c63c..46aabb6 100644 --- a/ZCppMainTest/ZtCLinkList_000.cpp +++ b/ZCppMainTest/ZtCLinkList_000.cpp @@ -23,6 +23,7 @@ namespace ZNsMain typedef ZCLinkStrList::ZCObjOpt ZCStrLinkOpt ; public: + static void ShowNode0(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt) { ++ARRI_CallCnt; @@ -42,6 +43,13 @@ namespace ZNsMain static void ShowNode1(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt)*/ + static void AppendEach(ZCLinkCStr& AR_CLink) + { + AR_CLink().append("_"); + }/* + static void AppendEach(ZCLinkCStr& AR_CLink)*/ + + static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0) { ZTypLong VI_CallCnt = 0 ; @@ -106,6 +114,28 @@ namespace ZNsMain cout<<"***********************************************"<