commit 2025-10-06 10:50 add SendRangeOutAfter() : ZCppMain/ZtCLinkList.H
This commit is contained in:
@ -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<typename TFunctor> void IterElement(TFunctor AO_Functor)
|
||||
{
|
||||
ZCLink* VP_LoopLink=mp_HeadLink;
|
||||
|
@ -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<<"***********************************************"<<endl;
|
||||
|
||||
|
||||
VO_ZCLinkStrLis1.IterElement(&AppendEach);
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
|
||||
VO_ZCLinkStrLis1.SendRangeOutAfter
|
||||
(
|
||||
VO_ZCLinkStrLis1.GetObjOpt(1).value()
|
||||
, VO_ZCLinkStrLis1.GetObjOpt(2).value()
|
||||
, 2
|
||||
, VO_ZCLinkStrLis2
|
||||
, VO_ZCLinkStrLis2.GetObjOpt(1)
|
||||
) ;
|
||||
cout<<"# after VO_ZCLinkStrLis1.SendRangeOutAfter(1th, 2th, 2, rhs, rhs's 1th)"<<endl;
|
||||
|
||||
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
|
||||
VO_ZCLinkStrLis2.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
|
||||
|
||||
return 0;
|
||||
}/*
|
||||
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
||||
|
Reference in New Issue
Block a user