//revised 96 01 07 // tasks // to improve copy constructor of TList to avoid double transfer #include ; /////////////////// link clases ////////////////////////////////// class Link { public: Link ( Link* pNext ) : _pNext(pNext), _id(0) {} Link* Next () const { return _pNext; } SetNext (Link* pNext) { _pNext = pNext; } int id() { return _id; } Setid(int id) { _id = id; } private: Link* _pNext; int _id; }; template class TLink : public Link { T data; public: TLink(Link* pNext, const T& a) : Link ( pNext ), data(a){} //friend ostream& operator << ( ostream& stm, const TLink& tlink ); friend ostream& operator << ( ostream& stm, const TLink& tlink ); const T* Data() const{ return &data;} const T CpyData() const{ //T retdata(data); //return retdata; } }; //////////////////////// base class of list clases //////////////////////// class List { public: int cu; List (): _pHead (0), cu(0) {} // ~List (); //void Add (); //const Link * Get(); const Link* GetHead () const { return _pHead; } //protected: Link* _pHead; ~List () { //cout<Next(); // unlink pLink //cout<Next(); count++; } return count; } int RenumLink () { int count = 1; Link* pLink = _pHead; while ( pLink != 0 ) { pLink->Setid(count); pLink = pLink->Next(); count++; } return count; } const Link * Get() { return GetHead(); } }; ////////////// not intrusive list class1 //////////////////////////////////// ////////////// not intrusive list class1 //////////////////////////////////// ////////////// not intrusive list class1 //////////////////////////////////// template class TList : public List { public: void Add (const T& a, int ren = 0) { // add in front of the list Link* pLink = new TLink ( _pHead, a ); if(pLink != 0) { _pHead = pLink; } if (ren == 0) { RenumLink(); } } int Remove (int n) { //cout<Next(); delete (TLink*)delLink; RenumLink(); return 1; } //----------------------- Link* pLink = _pHead; Link* preLink = _pHead; for(int i=1;iNext(); if(pLink == 0) {cout<* TpLink=(TLink*)pLink; TLink* TpreLink=(TLink*)preLink; //cout< SetNext(pLink->Next()); pLink -> SetNext(0); // unlink pLink delete (TLink*)pLink; RenumLink(); //----------------------- } // REWRITE IT without checking inequality != int Remove ( TLink * pTLink) { /* int count=1; Link* pLink = _pHead; while( ( *((TLink*)pLink)->Data() != *p ) && (pLink != 0) ) { pLink = pLink->Next(); count++; } if(pLink != 0){ Remove(count); } */ Remove(pTLink->id()); } //****************************************** AddIfDiff (const T& t); T * Get() { return (T*)List::Get();} TLink * Get(int n); TList() : List() {} TList ::TList(const TList& tlist); ~TList () { //cout<Next(); // unlink pLink //cout<*)pLink); } } friend ostream& operator << ( ostream& stm, const TList& list ); friend TList_Transfer(TList& listDest, TList& listSrc, int kind); }; //****************************************** //------------------ stream operators ----------------- template ostream& operator << ( ostream& stm, const TLink& tlink ) { stm<* tpLink = (TLink*)pLink; stm<Next(); } //stm<GetHead();} //~List_iterator() //{ //cout<Next(); return retLink; } template class TList_iterator : public List_iterator { public: TList_iterator(TList& list) : List_iterator(list){} //~TList_iterator() //{ //cout< * operator++(); }; template TLink * TList_iterator::operator++() { return (TLink*)List_iterator::operator++(); } //////////////////////////////////////////////////// //////////////////////////////////////////////////// //////////////////////////////////////////////////// ///////////////////////////////////////////////////// //Transaction only diffrent kind //------------------------------ #define TR_DIFFRENTADD 0 #define TR_ALLADD 1 #define TR_MOVE 2 template TList_Transfer(TList& listDest, TList& listSrc, int kind) { switch(kind) { case TR_DIFFRENTADD: { TList_iterator SrcTiter(listSrc); const TLink * srcTLink; while( srcTLink=SrcTiter++ ) { listDest.AddIfDiff( *(srcTLink->Data()) ); } } break; case TR_ALLADD: { TList_iterator SrcTiter(listSrc); const TLink * srcTLink; while( srcTLink=SrcTiter++ ) { listDest.Add( *(srcTLink->Data()) ); } } break; case TR_MOVE: { listDest.TList::~TList(); listDest._pHead = listSrc._pHead; listSrc._pHead=0; } break; } } //////////////////////////////////////////////////// // add only diffrent element in front of the list template int TList::AddIfDiff (const T& t) { Link* pLink = _pHead; while ( pLink != 0 ) { TLink* pTLink = (TLink*)pLink; //T tt( *(pTLink->Data()) ); //T tt( pTLink->CpyData() ); //if( !(tt != t) ) { return 0; } pLink = pLink->Next(); } Add (t); return 1; } /////////////////////////////////////////////////// template TList ::TList(const TList& tlist) //TList ::TList(TList& tlist) { //cout< tmpList; //tmpList._pHead=0; Link* tmpLink = tlist._pHead; while ( tmpLink != 0 ) { TLink* tmpTLink = (TLink*)tmpLink; tmpList.Add( *(tmpTLink->Data()), 1 ); //Add( *(tmpTLink->Data()), 1 ); //pLink->Setid(pLink->id()); tmpLink=tmpLink->Next(); } //cout<* pTLink = (TLink*)pLink; Add( *(pTLink->Data()), 1 ); //Add( *(pTLink->Data()), 1 ); //pLink->Setid(pLink->id()); pLink=pLink->Next(); } RenumLink(); } template TLink* TList ::Get(int n) { if(n < 1) {cout<Next(); if(pLink == 0) {cout<* tpLink = (TLink*)pLink; return tpLink; } char pizda='p';