source: git/kernel/f5lists.cc @ bc103b

spielwiese
Last change on this file since bc103b was c4158f, checked in by Christian Eder, 15 years ago
delete some double checkings, changed list stuff for last elements in lists git-svn-id: file:///usr/local/Singular/svn/trunk@11557 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 23.7 KB
Line 
1#include "mod2.h"
2
3#ifdef HAVE_F5
4#include "kutil.h"
5#include "structs.h"
6#include "omalloc.h"
7#include "polys.h"
8#include "p_polys.h"
9#include "ideals.h"
10#include "febase.h"
11#include "kstd1.h"
12#include "khstd.h"
13#include "kbuckets.h"
14#include "weight.h"
15#include "intvec.h"
16#include "pInline1.h"
17#include "f5gb.h"
18#include "f5data.h"
19#include "f5lists.h"
20
21/*
22====================================
23functions working on the class LNode
24====================================
25*/
26
27// generating new list elements (labeled / classical polynomial / LNode view)
28LNode::LNode() {
29    data                =   NULL;
30    next                =   NULL;
31}
32LNode::LNode(LPoly* lp) {
33    data                =   lp;
34    next                =   NULL;
35}
36       
37LNode::LNode(LPoly* lp, LNode* l) {
38//Print("HIER LNODE\n");
39    data                =   lp;
40    next                =   l;
41}
42
43LNode::LNode(poly t, int i, poly p, Rule* r) {
44LPoly* lp           =   new LPoly(t,i,p,r);
45data                =   lp;
46next                =   NULL;
47}
48       
49LNode::LNode(poly t, int i, poly p, Rule* r, LNode* l) {
50    LPoly* lp           =   new LPoly(t,i,p,r);
51    data                =   lp;
52    next                =   l;
53}
54
55LNode::LNode(LNode* ln) {
56    data                =   ln->getLPoly();
57    next                =   ln->getNext();
58}
59       
60LNode::~LNode() {
61    //delete next;
62    //Print("DELETE LNODE\n");
63    delete data;   
64}
65
66void LNode::deleteAll() {
67    while(NULL != next) {
68        //Print("%p\n",next);
69        //pWrite(next->data->getPoly());
70        next->deleteAll();
71    }
72    delete data;
73}
74
75// insert new elements to the list always at the end (labeled / classical polynomial view)
76// needed for list gPrev
77inline LNode* LNode::insert(LPoly* lp) {
78    //Print("INSERTION: \n");
79    //Print("LAST GPREV: ");
80    //pWrite(this->getPoly());
81    LNode* newElement   =   new LNode(lp, NULL);
82    this->next          =   newElement;
83    return newElement;
84}
85       
86inline LNode* LNode::insert(poly t, int i, poly p, Rule* r) {
87    LNode* newElement   =   new LNode(t, i, p, r, NULL);
88    this->next          =   newElement;
89    return newElement;
90}
91
92// insert new elements to the list always in front (labeled / classical polynomial view)
93// needed for sPolyList
94inline LNode* LNode::insertSP(LPoly* lp) {
95    LNode* newElement   =   new LNode(lp, this);
96    //Print("INSERTED IN SPOLYLIST: ");
97    //pWrite(lp->getTerm());
98    return newElement;
99}
100       
101inline LNode* LNode::insertSP(poly t, int i, poly p, Rule* r) {
102    LNode* newElement   =   new LNode(t, i, p, r, this);
103     //Print("INSERTED IN SPOLYLIST: ");
104  //pWrite(t);
105return newElement;
106}
107// insert new elemets to the list w.r.t. increasing labels
108// only used for the S-polys to be reduced (TopReduction building new S-polys with higher label)
109inline LNode* LNode::insertByLabel(poly t, int i, poly p, Rule* r) {
110    //Print("ADDING SOLYS TO THE LIST\n");
111    //Print("new element: ");
112    //pWrite(t);
113       if(NULL == this) { // || NULL == data) {
114        LNode* newElement   =   new LNode(t, i, p, r, this);
115        return newElement;
116    }
117    else {
118         //Print("tested element1: ");
119    //pWrite(this->getTerm());
120        if(-1 == pLmCmp(t,this->getTerm())) {
121            //Print("HIERDRIN\n");
122            LNode* newElement   =   new LNode(t, i, p, r, this);
123            //Print("%p\n",this);
124            //Print("%p\n",newElement->next);
125            return newElement;
126        }
127        else {
128            LNode* temp = this;
129            while(NULL != temp->next && NULL != temp->next->data) {
130                //Print("tested element: ");
131                //pWrite(temp->getTerm());
132 if(-1 == pLmCmp(t,temp->next->getTerm())) {
133                    LNode* newElement   =   new LNode(t, i, p, r, temp->next);
134                    temp->next          =   newElement;
135                    return this;
136                }
137                else {
138                    temp = temp->next;
139                    //Print("%p\n",temp);
140                    //Print("%p\n",temp->data);
141                   
142                    //Print("%p\n",temp->next);
143                }
144            }
145        //Print("HIER\n");
146            LNode* newElement   =   new LNode(t, i, p, r, temp->next);
147            temp->next          =   newElement;
148            return this;
149        }
150    }
151}
152
153// deletes the first elements of the list with the same degree
154// only used for the S-polys, which are already sorted by increasing degree by CList
155LNode*  LNode::deleteByDeg() {
156    return this;
157}
158
159// get next from current LNode
160LNode* LNode::getNext() {
161    return next;
162}
163
164// get the LPoly* out of LNode*
165LPoly* LNode::getLPoly() {
166    return data;
167}
168
169// get the data from the LPoly saved in LNode
170poly LNode::getPoly() {
171    return data->getPoly();
172}
173
174poly LNode::getTerm() {
175    return data->getTerm();
176}
177
178int LNode::getIndex() {
179    return data->getIndex();
180}
181
182Rule* LNode::getRule() {
183    return data->getRule();
184}
185
186// set the data from the LPoly saved in LNode
187void LNode::setPoly(poly p) {
188    data->setPoly(p);
189}
190
191void LNode::setTerm(poly t) {
192    data->setTerm(t);
193}
194
195void LNode::setIndex(int i) {
196    data->setIndex(i);
197}
198
199void LNode::setNext(LNode* l) {
200    next    =   l;
201}
202
203// test if for any list element the polynomial part of the data is equal to *p
204bool LNode::polyTest(poly* p) {
205    LNode* temp = new LNode(this);
206    while(NULL != temp) {
207        if(pComparePolys(temp->getPoly(),*p)) {
208            return 1;
209        }
210        temp = temp->next;
211    }
212    return 0;
213}
214
215LNode* LNode::getNext(LNode* l) {
216    return l->next;
217}
218
219// for debugging
220void LNode::print() {
221    LNode* temp = this;
222    Print("___________________List of S-polynomials______________________:\n");
223    Print("%p\n",this);
224    while(NULL != temp && NULL != temp->data) {
225        Print("Index: %d\n",temp->getIndex());
226        Print("Term: ");
227        pWrite(temp->getTerm());
228        Print("Poly: ");
229        pWrite(temp->getPoly());
230        Print("%p\n",temp->next);
231        temp = temp->next;
232    }
233    Print("_______________________________________________________________\n");
234}
235
236
237/*
238====================================
239functions working on the class LList
240====================================
241*/
242
243LList::LList() {
244    first   =   last    =   NULL;;
245    length  =   0;
246}
247
248LList::LList(LPoly* lp) {
249    first   =   new LNode(lp);
250    last    =   first;
251    length  =   1;
252}
253
254LList::LList(poly t,int i,poly p,Rule* r) {
255    first   =   new LNode(t,i,p,r);
256    last    =   first;
257    length  =   1;
258} 
259
260LList::~LList() {
261    LNode* temp;
262    while(first) {
263        temp    =   first;
264        first   =   first->getNext();
265        delete  temp;
266        //Print("%p\n",first);
267    }
268}
269
270// insertion at the end of the list, needed for gPrev
271void LList::insert(LPoly* lp) {
272    last = last->insert(lp);
273    //Print("NEW LAST GPREV: ");
274    //pWrite(last->getPoly());
275    length++;
276    //Print("LENGTH %d\n",length);
277}
278
279void LList::insert(poly t,int i, poly p, Rule* r) {
280    last = last->insert(t,i,p,r);
281    length++;
282    //Print("LENGTH %d\n",length);
283}
284
285// insertion in front of the list, needed for sPolyList
286void LList::insertSP(LPoly* lp) {
287    first = first->insertSP(lp);
288    length++;
289    //Print("LENGTH %d\n",length);
290}
291
292void LList::insertSP(poly t,int i, poly p, Rule* r) {
293    first = first->insertSP(t,i,p,r);
294    length++;
295    //Print("LENGTH %d\n",length);
296}
297
298
299void LList::insertByLabel(poly t, int i, poly p, Rule* r) {
300    first = first->insertByLabel(t,i,p,r);
301    length++;
302    //Print("LENGTH %d\n",length);
303}
304
305void LList::insertByLabel(LNode* l) {
306    first = first->insertByLabel(l->getTerm(),l->getIndex(),l->getPoly(),l->getRule());
307    length++;
308    //Print("LENGTH %d\n",length);
309}
310
311void LList::deleteByDeg() {
312    first = first->deleteByDeg();
313}
314
315bool LList::polyTest(poly* p) {
316    return first->polyTest(p);
317}
318
319LNode* LList::getFirst() {
320    return first;
321}
322
323LNode* LList::getLast() {
324    return last;
325}
326
327int LList::getLength() {
328    return length;
329}
330
331void LList::setFirst(LNode* l) {
332    LNode* temp =   first;
333    temp->setNext(NULL);
334    first       =   l;
335    length--;
336}
337
338void LList::print() {
339    first->print();
340}
341
342/*
343=======================================
344functions working on the class LTagNode
345=======================================
346*/
347LTagNode::LTagNode() {
348    data    =   NULL;
349    next    =   NULL;
350}
351
352LTagNode::LTagNode(LNode* l) {
353    data = l;
354    next = NULL;
355}
356       
357LTagNode::LTagNode(LNode* l, LTagNode* n) {
358    data = l;
359    next = n;
360}
361
362 LTagNode::~LTagNode() {
363    delete next;
364    delete data;   
365}
366       
367// declaration with first as parameter due to sorting of LTagList
368LTagNode* LTagNode::insert(LNode* l) {
369    LTagNode* newElement  = new LTagNode(l, this);
370    return newElement;
371}
372
373LNode* LTagNode::getLNode() {
374    return this->data;
375}
376
377LTagNode* LTagNode::getNext() {
378    return next;
379}
380
381// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
382//       Thus given actual index i and idx being the index of the LPoly under investigation
383//       the element on position length-idx is the right one
384LNode* LTagNode::get(int idx, int length) {
385    if(idx == 1) {
386        return NULL;
387    }
388    else {
389        int j;
390        LTagNode* temp = this; // last
391        for(j=1;j<=length-idx+1;j++) {
392            temp = temp->next;
393        }
394        return temp->data;
395    }
396}
397
398
399/*
400=======================================
401functions working on the class LTagList
402=======================================
403*/
404LTagList::LTagList() {
405    LTagNode* first =   new LTagNode();
406   
407    length          =   0;
408}
409
410LTagList::LTagList(LNode* l) {
411    LTagNode* first =   new LTagNode(l);
412    length          =   1;
413}
414
415// declaration with first as parameter in LTagNode due to sorting of LTagList
416void LTagList::insert(LNode* l) {
417    first   =   first->insert(l);
418    length++;
419}
420
421void LTagList::setFirstCurrentIdx(LNode* l) {
422    firstCurrentIdx =   l;
423}
424
425LNode* LTagList::get(int idx) {
426    return first->get(idx, length);
427}
428
429LNode* LTagList::getFirst() {
430    return first->getLNode();
431}
432
433LNode* LTagList::getFirstCurrentIdx() {
434    return firstCurrentIdx;
435}
436
437/*
438=====================================
439functions working on the class TopRed
440=====================================
441*/
442
443TopRed::TopRed() {
444    _completed  =   NULL;
445    _toDo       =   NULL;
446}
447
448TopRed::TopRed(LList* c, LList* t) {
449    _completed  =   c;
450    _toDo       =   t;
451}
452
453LList* TopRed::getCompleted() {
454    return _completed;
455}
456
457LList* TopRed::getToDo() {
458    return _toDo;
459}
460
461/*
462====================================
463functions working on the class CNode
464====================================
465*/
466
467CNode::CNode() {
468    data    =   NULL;   
469    next    =   NULL;   
470}
471
472CNode::CNode(CPair* c) {
473    data    =   c;   
474    next    =   NULL;   
475}
476
477CNode::CNode(CPair* c, CNode* n) {
478    data    =   c;   
479    next    =   n;   
480}
481
482CNode::~CNode() {
483    delete data;
484}
485
486// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
487// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
488// working only with linked, but not doubly linked lists due to memory usage we have to check the
489// insertion around the first element separately from the insertion around all other elements in the list
490CNode* CNode::insert(CPair* c) {
491    if(NULL == this) {
492        CNode* newElement   =   new CNode(c, this);
493        return newElement;
494    }
495    else {
496        poly u1 = ppMult_qq(c->getT1(),c->getLp1Term());
497        if( c->getDeg() < this->data->getDeg() ) { // lower degree than the first list element
498            CNode* newElement   =   new CNode(c, this);
499            return newElement;
500        }
501        if( c->getDeg() == this->data->getDeg() ) { // same degree than the first list element
502            if(1 != pLmCmp(u1,ppMult_qq(this->data->getT1(), this->data->getLp1Term()))) {
503                //pWrite(u1);
504                //Print("Multi-Term in CritPairs Sortierung altes Element: ");
505                //pWrite(ppMult_qq(this->data->getT1(),this->data->getLp1Term()));
506                CNode* newElement   =   new CNode(c, this);
507                return newElement;
508            }
509            else {
510                //Print("Insert Deg\n");
511                CNode* temp = this;
512                while(  NULL != temp->next) {
513                    if(temp->next->data->getDeg() == c->getDeg() ) { 
514                        if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) {
515                            temp = temp->next;
516                        }
517                        else {
518                            CNode* newElement   =   new CNode(c, temp->next);
519                            temp->next          =   newElement;
520                            return this;
521                        } 
522                    }
523                    else {
524                        CNode* newElement   =   new CNode(c, temp->next);
525                        temp->next          =   newElement;
526                        return this;
527                    }
528                }
529                CNode* newElement   =   new CNode(c, NULL);
530                temp->next          =   newElement;
531                return this;
532            }
533        } // outer if-clause
534        if( c->getDeg() > this->data->getDeg() ) { // greater degree than the first list element
535            CNode* temp =   this;
536            while( NULL != temp->next ) {   
537                if( c->getDeg() < temp->next->data->getDeg() ) {
538                    CNode* newElement   =   new CNode(c, temp->next);
539                    temp->next          =   newElement;
540                    return this;
541                }
542                if( c->getDeg() == temp->next->data->getDeg() ) {
543                    if(1 != pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) { 
544                        CNode* newElement   =   new CNode(c, temp->next);
545                        temp->next          =   newElement;
546                        return this;
547                    }
548                    else {
549                        temp = temp->next;
550                        while(  NULL != temp->next ) {
551                            if( temp->next->data->getDeg() == c->getDeg() ) { 
552                                if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),
553                                               temp->next->data->getLp1Term()))) {
554                                    temp = temp->next;
555                                }
556                                else {
557                                    CNode* newElement   =   new CNode(c, temp->next);
558                                    temp->next          =   newElement;
559                                    return this;
560                                } 
561                            }
562                            else {
563                                CNode* newElement   =   new CNode(c, temp->next);
564                                temp->next          =   newElement;
565                                return this;
566                            }
567                        }
568                        CNode* newElement   =   new CNode(c, NULL);
569                        temp->next          =   newElement;
570                        return this;
571                    }
572                }
573                if( c->getDeg() > temp->next->data->getDeg() ) {
574                    temp    =   temp->next;
575                }
576            }
577            CNode* newElement   =   new CNode(c, NULL);
578            temp->next          =   newElement;
579            return this;
580        }
581    }
582}
583
584// get the first elements from CList which by the above sorting have minimal degree
585CNode* CNode::getMinDeg() {
586    CNode* temp = this;
587    while(NULL != temp) {
588        while(NULL != temp->next && temp->next->data->getDeg() == this->data->getDeg()) {
589            temp = temp->next;
590        }
591        CNode* returnCNode  =   temp->next;   
592        // every CList should end with a (NULL,NULL) element for a similar behaviour
593        // using termination conditions throughout the algorithm
594        temp->next          =   NULL;
595        return returnCNode;
596    }
597    return NULL;
598}
599
600CPair* CNode::getData() {
601    return data;
602}
603
604CNode* CNode::getNext() {
605    return next;
606}
607
608LPoly* CNode::getAdLp1() {
609    return this->data->getAdLp1();
610}
611
612LPoly* CNode::getAdLp2() {
613    return this->data->getAdLp2();
614}
615
616poly CNode::getLp1Poly() {
617    return this->data->getLp1Poly();
618}
619
620poly CNode::getLp2Poly() {
621    return this->data->getLp2Poly();
622}
623
624poly CNode::getLp1Term() {
625    return this->data->getLp1Term();
626}
627
628poly CNode::getLp2Term() {
629    return this->data->getLp2Term();
630}
631
632int CNode::getLp1Index() {
633    return this->data->getLp1Index();
634}
635
636int CNode::getLp2Index() {
637    return this->data->getLp2Index();
638}
639
640poly CNode::getT1() {
641    return this->data->getT1();
642}
643
644poly* CNode::getAdT1() {
645    return this->data->getAdT1();
646}
647
648poly CNode::getT2() {
649    return this->data->getT2();
650}
651
652poly* CNode::getAdT2() {
653    return this->data->getAdT2();
654}
655
656Rule* CNode::getTestedRule() {
657    return this->data->getTestedRule();
658}
659
660// for debugging
661void CNode::print() {
662    CNode* temp = this;
663    Print("___________________List of critical pairs______________________:\n");
664    while(NULL != temp) {
665        Print("LP1 Index: %d\n",temp->getLp1Index());
666        Print("T1: ");
667        pWrite(temp->getT1());
668        Print("LP1 Term: ");
669        pWrite(temp->getLp1Term());
670        Print("LP1 Poly: ");
671        pWrite(temp->getLp1Poly());
672        Print("LP2 Index: %d\n",temp->getLp2Index());
673        Print("T2: ");
674        pWrite(temp->getT2());
675        Print("LP2 Term: ");
676        pWrite(temp->getLp2Term());
677        Print("LP2 Poly: ");
678        pWrite(temp->getLp2Poly());
679        Print("\n");
680        temp = temp->next;
681    }
682}
683
684/*
685====================================
686functions working on the class CList
687====================================
688*/
689// for initialization of CLists, last element alwas has data=NULL and next=NULL
690CList::CList() {
691    first   =   NULL;
692}
693
694CList::CList(CPair* c) {
695    first   =   new CNode(c);
696}
697
698CList::~CList() {
699    CNode* temp;
700    while(NULL != first) {
701        temp    =   first;
702        first   =   first->getNext();
703        delete  temp;
704    }
705}
706
707// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
708// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
709void CList::insert(CPair* c) {
710    first = first->insert(c);
711}
712
713CNode* CList::getFirst() {
714    return first;
715}
716
717// get the first elements from CList which by the above sorting have minimal degree
718// returns the pointer on the first element of those
719CNode* CList::getMinDeg() {
720    CNode* temp     =   first;
721    first           =   first->getMinDeg();
722    return temp;
723}
724
725void CList::print() {
726    first->print();
727}
728
729/*
730====================================
731functions working on the class RNode
732====================================
733*/
734RNode::RNode() {
735    //Print("HIER RNODE CONSTRUCTOR\n");
736    data    =   NULL;
737    next    =   NULL;
738}
739
740RNode::RNode(Rule* r) {
741    data    =   r;
742    next    =   NULL;
743}
744
745RNode::~RNode() {
746    //Print("DELETE RULE\n");
747    delete  data;
748}
749
750RNode* RNode::insert(Rule* r) {
751    RNode* newElement   =   new RNode(r);
752    newElement->next    =   this;
753    return newElement;
754}
755
756RNode* RNode::insert(int i, poly t) {
757    //Print("IN INSERT: ");
758    //pWrite(t);
759    Rule*   r           =   new Rule(i,t);
760    //Print("ADDRESS OF RULE: %p\n",r);
761    RNode* newElement   =   new RNode(r);
762    //Print("ADDRESS OF RNODE: %p\n",newElement);
763    //Print("ADDRESS OF RNODE DATA: %p\n",newElement->getRule());
764    newElement->next    =   this;
765    return newElement;
766}
767
768RNode* RNode::getNext() {
769    return next;
770}   
771
772Rule* RNode::getRule() {
773    return data;
774}
775
776int RNode::getRuleIndex() {
777    return data->getIndex();
778}
779
780poly RNode::getRuleTerm() {
781    return data->getTerm();
782}
783
784/*
785====================================
786functions working on the class RList
787====================================
788*/
789RList::RList() {
790    first = new RNode();
791}
792
793RList::RList(Rule* r) {
794    first = new RNode(r);
795}
796
797RList::~RList() {
798    RNode* temp;
799    //Print("%p\n",first);
800    while(first->getRule()) {
801        temp    =   first;
802        first   =   first->getNext();
803        //Print("1 %p\n",first);
804        //if(first) {
805            //Print("1' %p\n",first->getRule());
806            //Print("2 %p\n",first->getNext());
807            //Print("3 %p\n",first->getNext()->getRule());
808            //Print("3 %p\n",first->getNext()->getRuleTerm());
809        //}
810        delete  temp;
811    }
812    //Print("FERTIG\n");
813} 
814
815void RList::insert(int i, poly t) {
816    first = first->insert(i,t);
817}
818
819void RList::insert(Rule* r) {
820    first = first->insert(r);
821}
822
823RNode* RList::getFirst() {
824    return first;
825}
826
827Rule* RList::getRule() {
828    return this->getRule();
829}
830
831/*
832=======================================
833functions working on the class RTagNode
834=======================================
835*/
836
837RTagNode::RTagNode() {
838    data = NULL;
839    next = NULL;
840}
841 
842RTagNode::RTagNode(RNode* r) {
843    data = r;
844    next = NULL;
845}
846       
847RTagNode::RTagNode(RNode* r, RTagNode* n) {
848   
849    data = r;
850    next = n;
851}
852
853RTagNode::~RTagNode() {
854    delete data;   
855}
856       
857// declaration with first as parameter due to sorting of RTagList
858RTagNode* RTagNode::insert(RNode* r) {
859    //Print("Hier1\n");
860    RTagNode* newElement  = new RTagNode(r, this);
861    //Print("Hier2\n");
862    return newElement;
863}
864
865RNode* RTagNode::getRNode() {
866    return this->data;
867}
868
869RTagNode* RTagNode::getNext() {
870    return next;
871}
872
873// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
874//       Thus given actual index i and idx being the index of the LPoly under investigation
875//       the element on position length-idx+1 is the right one
876RNode* RTagNode::get(int idx, int length) {
877    if(idx==1 || idx==0) {
878        // NOTE: We set this NULL as putting it the last element in the list, i.e. the element having
879        //       RNode* = NULL would cost lots of iterations at each step of F5inc, with increasing
880        //       length of the list this should be prevented
881        return NULL;
882    }
883    else {
884        int j;
885        RTagNode* temp = this; 
886    //Print("\n\nHIER IN GET IDX\n");
887    //Print("FOR LOOP: %d\n",length-idx+1);   
888    for(j=1; j<=length-idx+1; j++) {
889            temp = temp->next;
890        }
891        return temp->data;
892    }
893}
894
895void RTagNode::set(RNode* r) {
896    this->data  =   r;
897}
898
899void RTagNode::print() {
900    RTagNode* temp  =   this;
901    if(NULL != temp && NULL != temp->getRNode()) {
902        Print("1. element: %d,  ",getRNode()->getRule()->getIndex());
903        pWrite(getRNode()->getRule()->getTerm());
904        temp    =   temp->next;
905        int i   =   2;
906        while(NULL != temp->getRNode() && NULL != temp) {
907            Print("%d. element: %d,  ",i,getRNode()->getRule()->getIndex());
908            pWrite(getRNode()->getRule()->getTerm());
909            temp    =   temp->next;
910            i++;
911        }
912    }
913}
914/*
915=======================================
916functions working on the class LTagList
917=======================================
918*/
919
920RTagList::RTagList() {
921    RTagNode* first =   new RTagNode();
922    length          =   0;
923}
924
925RTagList::RTagList(RNode* r) {
926    RTagNode* first =   new RTagNode(r);
927    length          =   1;
928}
929
930RTagList::~RTagList() {
931    RTagNode* temp;
932    while(first) {
933        temp    =   first;
934        first   =   first->getNext();
935        delete  temp;
936    }
937}
938
939// declaration with first as parameter in LTagNode due to sorting of LTagList
940void RTagList::insert(RNode* r) {
941    first = first->insert(r);
942    //Print("LENGTH:%d\n",length);
943    length = length +1;
944    //Print("LENGTH:%d\n",length);
945}
946
947RNode* RTagList::getFirst() {
948    return first->getRNode();
949}
950
951RNode* RTagList::get(int idx) {
952    return first->get(idx, length);
953}
954
955void RTagList::setFirst(RNode* r) {
956    first->set(r);
957}
958
959void RTagList::print() {
960    first->print();
961}
962
963int RTagList::getLength() {
964    return length;
965}
966#endif
Note: See TracBrowser for help on using the repository browser.