diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index 35127b2..a72efcd 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -386,9 +386,12 @@ namespace ZNsMain mp_HeadLink=0; else { - ZCLink::MakeCircle( mp_HeadLink=mp_HeadLink->mp_NextLink, - AP_CutLink->mp_PrevLink - /*/////////////*/ ); + ZCLink::MakeCircle + ( + mp_HeadLink=mp_HeadLink->mp_NextLink, + AP_CutLink->mp_PrevLink + ); + ////////////////// }/* else*/ } diff --git a/ZCppMain/ZtCSortObjList.H b/ZCppMain/ZtCSortObjList.H index 00db1e9..cac5f61 100644 --- a/ZCppMain/ZtCSortObjList.H +++ b/ZCppMain/ZtCSortObjList.H @@ -1,15 +1,789 @@ +#ifndef __ZCPPMAIN__ZCSORT_LIST_H__ +#define __ZCPPMAIN__ZCSORT_LIST_H__ + + +/*//////////////////////////////////////////////////// + +¡á CDoublieList.H ¿Í CObjList.H °¡ include ÇÑ´Ù. + + -- 2013-04-30 22:57:00 + +////////////////////////////////////////////////////*/ + + #include "ZCppMain/ZMainHead.H" namespace ZNsMain { - template class ZtCSortObjList + // ¾ç¹æÇâ ¿¬°á¸®½ºÆ®¿¡ ´ëÇÑ Á¤·Ä Ŭ·¡½ºÀÌ´Ù. + + template class ZtCSortObjList { + public : + typedef typename TTypObjList::ZCLink ZCLink ; + typedef typename TTypObjList::TypeData TypeData; + typedef typename TTypObjList::TypeArg TypeArg ; + typedef typename TTypObjList::TypeSize TypeSize; + private: + + static inline bool IsMore(TypeArg AR_LeftType, TypeArg AR_RightType) + { + /* IsMore() ÇÔ¼ö¿Í IsLess() ´Â QuickSort() ¸â¹ö ÇÔ¼ö¿¡¼­ ¾²´Â + ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÀÔÇϱâ À§Çؼ­ Á¤ÀÇÇÏ¿´´Ù. */ + + return AR_LeftType > AR_RightType ; + }/* + static inline bool IsMore(TypeArg AR_LeftType, TypeArg AR_RightType)*/ + + static inline bool IsLess(TypeArg AR_LeftType, TypeArg AR_RightType) + { + return AR_LeftType < AR_RightType ; + }/* + static inline bool IsLess(TypeArg AR_LeftType, TypeArg AR_RightType)*/ + + + static inline void SwapLinkPtr(ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) + { + ZCLink* VP_Temp=APR_LinkI; APR_LinkI=APR_LinkJ; APR_LinkJ=VP_Temp; + }/* + static inline void SwapLinkPtr( ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) */ + + + template + + static void QuickSort + ( + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess , + ZCLink* APA_LinkPtrArr[], + TypeSize AL_FirstIndex , + TypeSize AL_LastIndex + ) + /*##################################################*/ + { + if(AL_FirstIndexi && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); + while(AL_FirstIndexGetData(), VP_PivotLinkPtr->GetData())); + + if(i + static void QuickSort + ( + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess , + ZCLink* APA_LinkPtrArr[], + TypeSize AL_FirstIndex , + TypeSize AL_LastIndex + ) + ###########################################################*/ + + + static void QuickSortAsc + ( + ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex + ) + /*####################*/ + { + if(AL_FirstIndexi && APA_LinkPtrArr[++i]->GetData() < VP_PivotLinkPtr->GetData()); + while(AL_FirstIndexGetData() > VP_PivotLinkPtr->GetData()); + + if(ii && APA_LinkPtrArr[++i]->GetData() > VP_PivotLinkPtr->GetData()); + while(AL_FirstIndexGetData() < VP_PivotLinkPtr->GetData()); + + if(iGetNextPtr(); + }/* + for(; i + static void QuickSort + ( + TTypObjList& ARR_CObjList , + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess + ) + ////////////////////////////////////////////////////// + { + if(ARR_CObjList.GetSize()<=1) return; + + TypeSize VL_SortSize = ARR_CObjList.GetSize() ; + ZCLink** VPP_LinkPtrArr= new ZCLink*[VL_SortSize]; + + if(VPP_LinkPtrArr==0) + { + // Add codes for memory over + + return; + }/* + if(VPP_LinkPtrArr==0)*/ + + ZCLink* VP_TempLink = + ARR_CObjList.GetHeadLinkPtr(); + TypeSize i=0 ; + + for(; iGetNextPtr(); + }/* + ///////////////////////*/ + + QuickSort + (APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1); + + for(i=1; i + static void QuickSort + ( + TTypObjList& ARR_CObjList , + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess + ) + ////////////////////////////////////////////////////*/ + + + static void QuickSortPart /*########################*/ + ( + TTypObjList& ARR_CObjList, + ZCLink* AP_HeadLink , + TypeSize AL_HeadPos , + ZCLink* AP_TailLink , + TypeSize AL_TailPos , + bool AB_IsAscending=true + ) + /*##################################################*/ + { + // AP_HeadLink ºÎÅÍ AP_TailLink ±îÁö¸¸ Á¤·Ä + + #ifdef _DEBUG + + if(ARR_CObjList.IsEmpty()==true || ARR_CObjList.Find(AP_HeadLink)!=AL_HeadPos || ARR_CObjList.Find(AP_TailLink)!=AL_TailPos || AL_HeadPos>AL_TailPos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_TailPos)*/ + + #endif //_DEBUG + + if(AL_HeadPos==1 && AL_TailPos==ARR_CObjList.GetSize()) + { + QuickSort(ARR_CObjList, AB_IsAscending); return; + }/* + if(AL_HeadPos==1 && AL_TailPos==ARR_CObjList.GetSize())*/ + + ZCLink* VP_PrevHead=AP_HeadLink->GetPrevPtr(); + ZCLink* VP_NextTail=AP_TailLink->GetNextPtr(); + TypeSize VL_SortSize=AL_TailPos-AL_HeadPos+1 ; + + ZCLink** VPP_LinkPtrArr = new ZCLink*[VL_SortSize]; + + if(VPP_LinkPtrArr==0) + { + // Add codes for memory over + + return; + }/* + if(VPP_LinkPtrArr==0)*/ + + ZCLink* VP_TempLink = AP_HeadLink; TypeSize i=0; + + for(; iGetNextPtr(); + }/* + ///////////////////////*/ + + if(AB_IsAscending==true) + QuickSortAsc (VPP_LinkPtrArr, 0, VL_SortSize-1); + else QuickSortDesc(VPP_LinkPtrArr, 0, VL_SortSize-1); + + for(i=1; imp_PrevLink, ARR_AddList.ml_Size ); + ARR_CutList.OnDelete( ARR_CutList.mp_HeadLink, 1, + ARR_CutList.mp_HeadLink->mp_PrevLink, ARR_CutList.ml_Size ); + bool (*pf_IsTrueValue)(TypeArg AR_Left,TypeArg rRigh); + + if(AB_IsAscending==true) + pf_IsTrueValue=IsMore; + else pf_IsTrueValue=IsLess; + + if(pf_IsTrueValue(ARR_AddList.GetTailData(), ARR_CutList.GetHeadData())==false) + { + ARR_AddList.JoinTail(ARR_CutList); return; // À̶§´Â ´õ ÀÌ»ó ºñ±³ÇÒ Çʿ䰡 ¾ø´Ù. + }/* + if(pf_IsTrueValue(ARR_AddList.GetTailData(), ARR_CutList.GetHeadData())==false)*/ + + ZCLink* VP_LhsTail =ARR_AddList.mp_HeadLink->mp_PrevLink; + ZCLink* VP_LhsTemp =ARR_AddList.mp_HeadLink; + ZCLink* VP_RhsHead =ARR_CutList.mp_HeadLink; + + TypeSize VL_LhsTempPos=1 ; // VP_LhsTemp ÀÇ À§Ä¡ + bool VB_IsMoved =false; + ZCLink* VP_TempLink =0 ; + + do ////// + { + if(pf_IsTrueValue(VP_LhsTemp->GetData(), VP_RhsHead->GetData())==true) + { + VP_TempLink=VP_RhsHead; + VP_RhsHead =VP_RhsHead->mp_NextLink; + + ARR_AddList.JoinBefore( ARR_CutList.CutLink(VP_TempLink,1), + VP_LhsTemp, + VL_LhsTempPos + /*/////////////////*/ ); ////////////////////////////////// + + /* VP_LhsTemp ¾Õ¿¡ ¸µÅ©°¡ Çϳª »ðÀԵǾúÀ¸¹Ç·Î, + VP_LhsTemp ÀÇ À§Ä¡°ªÀ» Çϳª Áõ°¡½ÃŲ´Ù. */ + + ++VL_LhsTempPos; VB_IsMoved=true; + }/* + if(pf_IsTrueValue(VP_LhsTemp->GetData(), VP_RhsHead->GetData())==true)*/ + + if(ARR_CutList.mp_HeadLink==0) return; + + if(VP_LhsTemp==VP_LhsTail) + { + ARR_AddList.JoinTail(ARR_CutList); return; + }/* + if(VP_LhsTemp==VP_LhsTail)*/ + + if(VB_IsMoved==false) + { + VP_LhsTemp=VP_LhsTemp->mp_NextLink; ++VL_LhsTempPos; + } + else + { + VB_IsMoved=false; + } + } + while(true); + }/* + static void MergeSort + (TTypObjList& ARR_AddList, TTypObjList& ARR_CutList, bool AB_IsAscending=true) + /*#################*/ + + + template void MakeUnique( /*############*/ + TTypObjList& ARR_CObjList , + TFunctor AR_Functor , + bool AB_IsSorted =false, + bool AB_IsAscending=true + /*#########*/ ) /*#########################################*/ + { + // ARR_CObjList ÀÇ °¢ ³ëµå¸¦ À¯ÀÏÇÏ°Ô ¸¸µç´Ù. + + if(AB_IsSorted==false) + QuickSort(ARR_CObjList,AB_IsAscending); + + TypeSize VL_LoopSize= ARR_CObjList.GetSize() ; + TypeSize VL_Index = 1 ; + ZCLink* VP_HeadLink= ARR_CObjList.GetHeadLinkPtr(); + ZCLink* VP_CutLink = 0 ; + + /* VL_LoopSize-1 ¹ø ¼øÈ¯ÇÏ¸ç °°Àº ¿ø¼Ò°¡ ÀÌ¿ôÇÑ´Ù¸é + ¾ÕµÚ ³ëµå¿¡ ´ëÇØ ¾î¶² 󸮸¦ ÇÏ°í µÚÂÊÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. */ + + for(TypeSize i=1; iGetData()==VP_HeadLink->GetNextPtr()->GetData()) + { + AR_Functor ////////////////////////// + ( + VP_HeadLink->GetData(), VP_HeadLink->GetNextPtr()->GetData() + ); + VP_CutLink=VP_HeadLink->GetNextPtr(); + + ARR_CObjList.Delete(VP_CutLink, VL_Index+1); + } + else + { + (VP_HeadLink=VP_HeadLink->GetNextPtr(), ++VL_Index); + } + }/* + for(TypeSize i=1; i void MakeUnique( ################ + TFunctor AR_Functor , + bool AB_IsSorted=false , + bool AB_IsAscending=true + ################# ) #######################################*/ + + + static void MakeUnique( /*#################################*/ + TTypObjList& ARR_CObjList , + bool AB_IsSorted =false, + bool AB_IsAscending=true + /*#########*/ ) /*#########################################*/ + { + // ARR_CObjList ÀÇ °¢ ³ëµå¸¦ À¯ÀÏÇÏ°Ô ¸¸µç´Ù. + + if(AB_IsSorted==false) + QuickSort(ARR_CObjList,AB_IsAscending); + + TypeSize VL_LoopSize =ARR_CObjList.GetSize() ; + TypeSize VL_Index =1 ; + ZCLink* VP_HeadLink =ARR_CObjList.GetHeadLinkPtr(); + ZCLink* VP_CutLink =0 ; + + /* VL_LoopSize-1 ¹ø ¼øÈ¯ÇÏ¸ç °°Àº ¿ø¼Ò°¡ ÀÌ¿ôÇÑ´Ù¸é + µÚÂÊÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. + */ + for(TypeSize i=1; iGetData()==VP_HeadLink->GetNextPtr()->GetData()) + { + VP_CutLink = VP_HeadLink->GetNextPtr() ; + + ARR_CObjList.Delete(VP_CutLink, VL_Index+1); + } + else + { + (VP_HeadLink=VP_HeadLink->GetNextPtr(), ++VL_Index); + } + }/* + for(TypeSize i=1; i static void SplitGroup( /*#####*/ + TTypObjList& ARR_CObjList , + TFunctor AR_Functor , + bool AB_IsSorted =false, + bool AB_IsAscending=true + /*#########*/ ) /*#########################################*/ + { + /* ARR_CObjList ÀÇ °¢ ³ëµå¸¦ °°Àº °Í³¢¸® ±×·ìÀ¸·Î ¹¬¾î¼­ + ¹­¿©Áø ¸®½ºÆ®¿¡ ´ëÇØ AR_Functor ¸¦ ¼öÇàÇÑ´Ù. + */ + if(ARR_CObjList.IsEmpty()) return; + + if(AB_IsSorted==false) + { + QuickSort(ARR_CObjList, AB_IsAscending); // Á¤·ÄÀÌ ¾ÈµÇ¾úÀ¸¸é Á¤·ÄÀ» Çϰí... + }/* + if(AB_IsSorted==false)*/ + + TypeSize VL_LoopSize=ARR_CObjList.GetSize() ; + TypeSize VL_TailPos =1 ; + + ZCLink* VP_CutHead =ARR_CObjList.GetHeadLinkPtr(); + ZCLink* VP_CutTail =VP_CutHead ; + ZCLink* VP_CutTemp =VP_CutTail->GetNextPtr() ; + + // VL_LoopSize-1 ¹ø ¼øÈ¯ + + for(TypeSize i=2; i<=VL_LoopSize; ++i) + { + if(VP_CutTail->GetData()==VP_CutTemp->GetData()) + { + VP_CutTail=VP_CutTemp ; + VP_CutTemp=VP_CutTemp->GetNextPtr() ; + + ++VL_TailPos; + } + else // VP_CutTail->GetData()!=VP_CutTemp->GetData() + { + /* ´ÙÀ½ ³ëµå¿Í ´Ù¸£¸é ÀÌÀü ³ëµåµéÀº ¼­·Î °°´Ù´Â °ÍÀÌ´Ù. + ÀÌÀü ³ëµåµéÀº functor ·Î 󸮸¦ ³Ñ±ä´Ù. functor ´Â + ³Ñ°Ü¹ÞÀº ¸®½ºÆ®¸¦ ¹Ýµå½Ã ½á¾ß(»èÁ¦Çؾß) ÇÑ´Ù. CutLink() + ¸â¹ö ÇÔ¼ö´Â ³»ºÎ¿¡ Á¤Àû ¸®½ºÆ® °³Ã¼¸¦ °¡Áö°í Àִµ¥ + ¿©±â¿¡ ¾µµ¥¾ø´Â ÀÚ·á°¡ ³²°ÜÁ®¼­´Â ¾ÈµÇ±â ¶§¹®ÀÌ´Ù. */ + + AR_Functor ////////////////////////////////////// + ( + ARR_CObjList.CutLink + ( + VP_CutHead, 1, VP_CutTail, VL_TailPos + ) + ); + ///////////////////////////////////////////////// + + VP_CutHead =VP_CutTemp; + VP_CutTail =VP_CutTemp; + VP_CutTemp =VP_CutTemp->GetNextPtr(); + + VL_TailPos =1 ; + }/* + else // VP_CutTail->GetData()!=VP_CutTemp->GetData()*/ + }/* + for(TypeSize i=2; i<=VL_LoopSize; ++i)*/ + + if(ARR_CObjList.IsEmpty()==false) AR_Functor(ARR_CObjList); + }/* + template static void SplitGroup( ########## + TTypObjList& ARR_CObjList , + TFunctor AR_Functor , + bool AB_IsSorted=false , + bool AB_IsAscending=true + ############# ) ############################################*/ + + public: };/* - template class ZtCSortObjList*/ + template class ZtCSortObjList */ + + + + // ´Ü¹æÇâ ¿¬°á¸®½ºÆ®¿¡ ´ëÇÑ Á¤·Ä Ŭ·¡½ºÀÌ´Ù. + + template class ZtCSortSimList + { + public : + typedef typename TTypObjList::ZCLink ZCLink ; + typedef typename TTypObjList::TypeData TypeData ; + typedef typename TTypObjList::TypeArg TypeArg ; + typedef typename TTypObjList::TypeSize TypeSize ; + private: + + static inline void SwapLinkPtr(ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) + { + ZCLink* + VP_Temp =APR_LinkI; + APR_LinkI=APR_LinkJ; + APR_LinkJ=VP_Temp; + }/* + static inline void SwapLinkPtr( ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) */ + + + template + + static void QuickSort + ( + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess , + ZCLink* APA_LinkPtrArr[], + TypeSize AL_FirstIndex , + TypeSize AL_LastIndex + ) + /*##################################################*/ + { + if(AL_FirstIndexi && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); + while(AL_FirstIndexGetData(), VP_PivotLinkPtr->GetData())); + + if(i + static void QuickSort + ( + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess , + ZCLink* APA_LinkPtrArr[], + TypeSize AL_FirstIndex , + TypeSize AL_LastIndex + ) + /*##################################################*/ + + /*private:*/ + public : + + template + + static void QuickSort + ( + TTypObjList& ARR_CObjList, + TTypFuncIsMore APF_IsMore , + TTypFuncIsLess APF_IsLess + ) + /*##################################################*/ + { + if(ARR_CObjList.GetSize()<=1) return; + + TypeSize VL_SortSize = ARR_CObjList.GetSize() ; + ZCLink** VPP_LinkPtrArr = new ZCLink*[VL_SortSize]; + + if(VPP_LinkPtrArr==0) + { + // Add codes for memory over + + return; + }/* + if(VPP_LinkPtrArr==0)*/ + + ZCLink* VP_TempLink = + ARR_CObjList.GetHeadLinkPtr(); + TypeSize i=0 ; + + for(; iGetNextPtr(); + } + ///////////////////////// + + QuickSort(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1); + + for(i=1; i + static void QuickSort(TTypObjList& ARR_CObjList, TTypFuncIsMore APF_IsMore, TTypFuncIsLess APF_IsLess) */ + + public: + };/* + template class ZtCSortSimList */ }/* namespace ZNsMain*/ + + +#endif //__ZCPPMAIN__ZCSORT_LIST_H__