template struct elem_link1 { T inf; elem_link1 *link; }; template class LList { public: LList(); //konstruktor ~LList(); //destruktor LList(LList const&); //copy-konstruktor LList& operator=(LList const &); //predifiniran operator = bool operator<(LList &); //predefiniran operator < bool operator>(LList &); //predefiniran operator > void print(); //izvejdane na spisuk na ekrana void IterStart(elem_link1* = NULL); //ukazva Current kum nachaloto elem_link1* Iter(); //premestva iteratora vuv sledvashta poziciq void ToEnd(T const &); //vkliuchva element v kraq na spisuka void ToStart(T const &); void InsertAfter(elem_link1*,T const &); //vkliuchvane na element sled ukazan element void InsertBefore(elem_link1*,T const &);//vkliuchvane na element predi ukazan element int DeleteAfter(elem_link1*,T &); //iztrivane na element sled ukazan element int DeleteBefore(elem_link1*,T &); //iztrivane na element predi ukazan element void DeleteElem(elem_link1*,T &); //iztrivane na element int len(); //duljina na spisuk void concat(LList const &); //konkatenaciq na neqvniq spisuk s ukazaniq kato parametur void reverse(); //obrushta spisuka naopaki LList mergelists(LList, LList); //slivane na sortirani spisuci void OddToEven(); //puvo nechetnite, posle chetnite v obraten red T GetEndInf(); //vrushta inf chastta na End T GetStartInf(); //vrushta inf chastta na Start bool empty(); //proverka dali e prazen spisuka bool member(T); //proverka dali daden element e chast ot spisuka void DeleteLast(); //iztriva posledniq element v spisuk LList Is_Longer_Than(LList &); //vrushta po-dulgiq ot *this i daden spisuk LList Is_Shorter_Than(LList &); //vrushta po-kusiq ot *this i daden spisuk LList Intersection(LList &); //vrushta sechenieto na tekushtiq spisuk s daden LList Union(LList &); //vrushta obedinenieto na tekushtiq spisuk s daden private: elem_link1 *Start; //ukazatel kum nachaloto elem_link1 *End; //ukazatel kum kraq elem_link1 *Current; //ukazatel kum tekusht element void DeleteList(); void CopyList(LList const &); }; template //iztrivane na spisuk void LList::DeleteList() { elem_link1 *p; while (Start) { p=Start; Start=Start->link; delete p; } End=NULL; } template //kopirane na spisuk void LList::CopyList(LList const & r) { Start=End=NULL; if (r.Start) { elem_link1 *p = r.Start; while (p) { ToEnd(p->inf); p=p->link; } } } template //G4 LList::LList() { Start=NULL; End=NULL; } template //G4 LList::~LList() { DeleteList(); } template //G4 LList::LList(LList const& r) { CopyList(r); } template //G4 LList& LList::operator=(LList const & r) { if (this!=&r) { DeleteList(); CopyList(r); } return *this; } template //predefiniran operator < bool LList::operator<(LList &r) { return this->len() //predefiniran operator > bool LList::operator>(LList &r) { return this->len()>r.len()?true:false; } template //izvejdane na spisuk na ekrana void LList::print() { elem_link1 *p = Start; while (p) { cout<inf<<" "; p=p->link; } cout< //ukazva Current kum nachaloto void LList::IterStart(elem_link1 *p) { if (p) Current=p; else Current=Start; } template //premestva iteratora vuv sledvashta poziciq elem_link1* LList::Iter() { elem_link1 *p=Current; if (Current) Current=Current->link; return p; } template //vkliuchva element v kraq na spisuka void LList::ToEnd(T const & x) { Current=End; End = new elem_link1; End->inf=x; End->link=NULL; if (Current) Current->link=End; else Start=End; } template //vkliuchvane na element sled ukazan element void LList::InsertAfter(elem_link1 *p,T const & x) { elem_link1 *q = new elem_link1; q->inf=x; q->link=p->link; if (p==End) End=q; p->link=q; } template //vkliuchvane na element predi ukazan element void LList::InsertBefore(elem_link1 *p,T const& x) { elem_link1 *q = new elem_link1; *q=*p; if (p==End) End=q; p->inf=x; p->link=q; } template //iztrivane na element sled ukazan element int LList::DeleteAfter(elem_link1 *p,T & x) { if(p->link) { elem_link1 *q=p->link; x=q->inf; p->link=q->link; if (q==End) End=p; delete q; return 1; } else return 0; } template //iztrivane na element void LList::DeleteElem(elem_link1 *p, T & x) { if (p==Start) { x=p->inf; if(Start==End) { Start=End=NULL; } else Start=Start->link; delete p; } else { elem_link1 *q=Start; while (q->link!=p) q=q->link; DeleteAfter(q, x); } } template //iztrivane na element predi ukazan element int LList::DeleteBefore(elem_link1 *p, T & x) { if (p!=Start) { elem_link1 *q=Start; while (q->link!=p) q=q->link; DeleteElem(q, x); return 1; } else return 0; } template //duljina na spisuk int LList::len() { int n=0; IterStart(); elem_link1 *p=Iter(); while (p) { n++; p=Iter(); } return n; } template //konkatenaciq na neqvniq spisuk s ukazaniq kato parametur void LList::concat(LList const & L) { elem_link1 *p=L.Start; while (p) { ToEnd(p->inf); p=p->link; } } template //obrushta spisuka naopaki void LList::reverse() { elem_link1 *p; elem_link1 *q; elem_link1 *temp; p=Start; if (p) { q=NULL; temp=Start; Start=End; End=temp; while (p!=Start) { temp=p->link; p->link=q; q=p; p=temp; } p->link=q; } } template //sortirane na spisuk void sortlist(LList & l) { element *mp; element *p; l.IterStart(); p=l.Iter(); while (p->link) { T min=p->inf; mp=p; elem_link1 *q=p->link; while (q) { if (q->inf<=min) { mp=q; min=q->inf; } q=q->link; } min=mp->inf; mp->inf=p->inf; p->inf=min; p=p->link; } } template //slivane na sortirani spisuci LList mergelists(LList l1, LList l2) { LList l; l1.IterStart(); l2.IterStart(); elem_link1 *p=l1.Iter(); elem_link1 *q=l2.Iter(); while (p && q) if (p->inf<=q->inf) { l.ToEnd(p->inf); p=l1.Iter(); } else { l.ToEnd(q->inf); q=l2.Iter(); } if (q) while(q) { l.ToEnd(q->inf); q=l2.Iter(); } else while(p) { l.ToEnd(p->inf); p=l1.Iter(); } return l; } template //vrushta inf chastta na End T LList::GetEndInf() { return this->End->inf; } template //vrushta inf chastta na Start T LList::GetStartInf() { return this->Start->inf; } template //proverka dali e prazen spisuka bool LList::empty() { if (Start==NULL) return true; else return false; } template //proverqva dali daden element e ot spisuka bool LList::member(T x) { IterStart(); elem_link1 *p = Iter(); while (p) { if (p->inf == x) return true; p = p->link; } return false; } template //iztriva posledniq element v spisuk void LList::DeleteLast() { if (empty()) return; int x; IterStart(); elem_link1 *p = Iter(); while (p->link) p = p->link; DeleteElem(p,x); } template //vrushta po-kusiq ot *this i daden spisuk LList LList::Is_Shorter_Than(LList &L1) { return *this //vrushta po-dulgiq ot *this i daden spisuk LList LList::Is_Longer_Than(LList &L1) { return *this>L1?*this:L1; } template //vrushta sechenieto na tekushtiq spisuk s daden LList LList::Intersection(LList &L) { LList Result; IterStart(); elem_link1 *p = Iter(); L.IterStart(); elem_link1 *q = L.Iter(); while (p) { while (q) { if (p->inf == q->inf) Result.ToEnd(p->inf); q = q->inf; } p = p->inf; } return Result; } template //vrushta obedinenieto na tekushtiq spisuk s daden LList LList::Union(LList &L) { LList Result; IterStart(); elem_link1 *p = Iter(); L.IterStart(); elem_link1 *q = L.Iter(); while (p) { while (q) { if (p->inf != q->inf) Result.ToEnd(p->inf); q = q->inf; } p = p->inf; } return Result; } template void LList::ToStart(T const & x) { if (empty()) ToEnd(x); else { Current = Start; Start = new elem_link1; Start->inf = x; Start->link = Current; } }