00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef NILIST
00036 #define NILIST
00037
00038 class slink {
00039 public:
00040 slink *next_;
00041 int key_;
00042 slink(int key=0) {next_=0; key_ = key;}
00043 slink(slink *p, int key=0) {next_ = p; key_ = key;}
00044 };
00045
00046 class slist_base {
00047 slink *last_;
00048 int count_;
00049 int append_count_;
00050 int remove_count_;
00051 public:
00052 slist_base() {last_ = 0;count_=0;append_count_=0;remove_count_=0;}
00053 slist_base(slink *a) {last_ = a->next_ = a;}
00054
00055 void insert(slink *a);
00056 void append(slink *a);
00057 void remove(slink *a, slink *prev);
00058
00059 slink *get();
00060 slink *find(int key);
00061
00062 void clear() {last_ = 0;}
00063 int count() {return count_;}
00064 slink *last() {return last_;}
00065 int ac() {return append_count_;}
00066 int rc() {return remove_count_;}
00067 friend class slist_base_iter;
00068 };
00069
00070 template<class T> class Islist_iter;
00071
00072 template<class T>
00073 class Islist : private slist_base {
00074 friend class Islist_iter<T>;
00075 public:
00076 void insert(T* a) {slist_base::insert(a);}
00077 void append(T* a) {slist_base::append(a);}
00078 void remove(T* a, T* prev) {slist_base::remove(a,prev);}
00079 T *get() {return (T* ) slist_base::get();}
00080 T *find(int key) {return (T*) slist_base::find(key);}
00081 int count() {return slist_base::count();}
00082 };
00083
00084 template<class T>
00085 struct Tlink : public slink {
00086 T info;
00087 Tlink(const T& a) : info(a) { }
00088 };
00089
00090 template<class T> class Slist_iter;
00091
00092 template<class T>
00093 class Slist: private slist_base {
00094 friend class Slist_iter<T>;
00095 public:
00096 void insert(const T& a)
00097 { slist_base::insert(new Tlink<T>(a));}
00098 void append(const T& a)
00099 { slist_base::append(new Tlink<T>(a));}
00100 T get();
00101 };
00102
00103 class slist_base_iter
00104 {
00105 slink *ce;
00106 slist_base *cs;
00107 public:
00108 slist_base_iter(slist_base &s);
00109 void set_cur(slink *cur) {ce = cur;}
00110 slink *get_cur() {return ce;}
00111 slink *get_last() {return cs->last_;}
00112 slink *operator() ();
00113 int count() {return cs->count();}
00114 };
00115
00116 template <class T>
00117 class Islist_iter : public slist_base_iter {
00118 public:
00119 Islist_iter(Islist<T> &s) : slist_base_iter(s) { }
00120 T *operator() ()
00121 { return (T *) slist_base_iter::operator() (); }
00122 T *get_last() {return (T *) slist_base_iter::get_last(); }
00123 T *get_cur() {return (T *) slist_base_iter::get_cur(); }
00124 };
00125
00126 template <class T>
00127 class Slist_iter : public slist_base_iter {
00128 public:
00129 Slist_iter(Slist<T> &s) : slist_base_iter(s) { }
00130 inline T *operator() ();
00131 };
00132
00133
00134
00135 #endif