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_HeadLink = &AR_LinkNew ;
|
||||||
mp_TailLink = &AR_LinkNew ;
|
mp_TailLink = &AR_LinkNew ;
|
||||||
@ -1081,10 +1081,15 @@ namespace ZNsMain
|
|||||||
}/*
|
}/*
|
||||||
else*/
|
else*/
|
||||||
}
|
}
|
||||||
|
else if(AP_LinkStd==mp_TailLink)
|
||||||
|
{
|
||||||
|
ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ;
|
||||||
|
ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ;
|
||||||
|
|
||||||
|
mp_TailLink = &AR_LinkNew;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++ml_LinkSize;
|
|
||||||
|
|
||||||
ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ;
|
ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ;
|
||||||
|
|
||||||
ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew);
|
ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew);
|
||||||
@ -1092,7 +1097,7 @@ namespace ZNsMain
|
|||||||
}/*
|
}/*
|
||||||
else*/
|
else*/
|
||||||
|
|
||||||
return AR_LinkNew;
|
++ml_LinkSize; return AR_LinkNew;
|
||||||
}/*
|
}/*
|
||||||
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
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_HeadLink = &AR_LinkNew ;
|
||||||
mp_TailLink = &AR_LinkNew ;
|
mp_TailLink = &AR_LinkNew ;
|
||||||
@ -1122,10 +1127,15 @@ namespace ZNsMain
|
|||||||
}/*
|
}/*
|
||||||
else*/
|
else*/
|
||||||
}
|
}
|
||||||
|
else if(AP_LinkStd==mp_HeadLink)
|
||||||
|
{
|
||||||
|
ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink);
|
||||||
|
ZCLink::MakeRing(&AR_LinkNew, mp_TailLink);
|
||||||
|
|
||||||
|
mp_HeadLink = &AR_LinkNew;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++ml_LinkSize;
|
|
||||||
|
|
||||||
ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ;
|
ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ;
|
||||||
|
|
||||||
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
|
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
|
||||||
@ -1133,7 +1143,7 @@ namespace ZNsMain
|
|||||||
}/*
|
}/*
|
||||||
else*/
|
else*/
|
||||||
|
|
||||||
return AR_LinkNew;
|
++ml_LinkSize; return AR_LinkNew;
|
||||||
}/*
|
}/*
|
||||||
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
||||||
|
|
||||||
@ -1274,6 +1284,93 @@ namespace ZNsMain
|
|||||||
}/*
|
}/*
|
||||||
ZCLink& CutLink(ZCLink& AR_CutLink)*/
|
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:*/
|
/*private:*/
|
||||||
public :
|
public :
|
||||||
|
|
||||||
@ -1476,6 +1573,36 @@ namespace ZNsMain
|
|||||||
void SendOutTail(ZCLink& AR_CutLink, ZtCLinkList& rhs)*/
|
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)
|
template<typename TFunctor> void IterElement(TFunctor AO_Functor)
|
||||||
{
|
{
|
||||||
ZCLink* VP_LoopLink=mp_HeadLink;
|
ZCLink* VP_LoopLink=mp_HeadLink;
|
||||||
|
@ -23,6 +23,7 @@ namespace ZNsMain
|
|||||||
typedef ZCLinkStrList::ZCObjOpt ZCStrLinkOpt ;
|
typedef ZCLinkStrList::ZCObjOpt ZCStrLinkOpt ;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
static void ShowNode0(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt)
|
static void ShowNode0(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt)
|
||||||
{
|
{
|
||||||
++ARRI_CallCnt;
|
++ARRI_CallCnt;
|
||||||
@ -42,6 +43,13 @@ namespace ZNsMain
|
|||||||
static void ShowNode1(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt)*/
|
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)
|
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)
|
||||||
{
|
{
|
||||||
ZTypLong VI_CallCnt = 0 ;
|
ZTypLong VI_CallCnt = 0 ;
|
||||||
@ -106,6 +114,28 @@ namespace ZNsMain
|
|||||||
cout<<"***********************************************"<<endl;
|
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;
|
return 0;
|
||||||
}/*
|
}/*
|
||||||
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
||||||
|
Reference in New Issue
Block a user