00001
00002
00003 #ifndef __J2K__SList_CPP__
00004 #define __J2K__SList_CPP__
00005
00006 #include <j2k/DataType/Link/SList.hpp>
00007
00008
00009
00010
00011
00012
00013 inline SList::SList()
00014 : nbElements( 0 ), pos( 0 )
00015 {
00016 head = tail = curr = new SLink();
00017 }
00018
00019 SList::~SList()
00020 {
00021 while( head != NULL )
00022 {
00023 curr = head;
00024 head = head->next;
00025 delete curr;
00026 }
00027 }
00028
00029 void SList::clear()
00030 {
00031 while( head->next != NULL )
00032 {
00033 curr = head->next;
00034 head->next = curr->next;
00035 delete curr;
00036 }
00037
00038 curr = tail = head;
00039 pos = 0;
00040 nbElements = 0;
00041 }
00042
00043 void SList::setFirst()
00044 {
00045 curr = head;
00046 pos = 0;
00047 }
00048
00049
00050 void SList::insert( Elem item )
00051 {
00052 assert( curr != NULL );
00053 curr->next = new SLink( item, curr->next );
00054
00055 if ( tail == curr )
00056 {
00057 tail = curr->next;
00058 }
00059
00060 nbElements++;
00061 }
00062
00063 inline void SList::append( Elem item )
00064 {
00065 curr = tail = tail->next = new SLink( item, NULL );
00066 nbElements++;
00067 pos++;
00068 }
00069
00070 inline void SList::enqueue( Elem item )
00071 {
00072 append( item );
00073 }
00074
00075 inline Elem SList::dequeue()
00076 {
00077 curr = head;
00078 return remove();
00079 }
00080
00081 Elem SList::remove()
00082 {
00083 assert( isInList() );
00084 Elem temp = curr->next->element;
00085 SLink* ltemp = curr->next;
00086 curr->next = ltemp->next;
00087 if (tail == ltemp) tail = curr;
00088 delete ltemp;
00089
00090 nbElements--;
00091 return temp;
00092 }
00093
00094 inline void SList::next()
00095 {
00096 if (curr != NULL)
00097 {
00098 curr = curr->next;
00099 pos++;
00100 }
00101 }
00102
00103
00104 void SList::prev()
00105 {
00106 SLink* temp = head;
00107 if ((curr == NULL) || (curr == head))
00108 {
00109 curr = NULL;
00110 return;
00111 }
00112
00113 while( ( temp != NULL ) && ( temp->next != curr ) )
00114 {
00115 temp = temp->next;
00116 }
00117
00118 curr = temp;
00119 pos--;
00120 }
00121
00122 long SList::size() const
00123 {
00124 return nbElements;
00125 }
00126
00127 long SList::getPos() const
00128 {
00129 return pos;
00130 }
00131
00132
00133 ULONG SList::length() const
00134 {
00135 register ULONG cnt = 0;
00136 SLink* temp = head->next;
00137
00138 for ( ; temp != NULL; temp = temp->next )
00139 {
00140 cnt++;
00141 }
00142
00143 return cnt;
00144 }
00145
00146 void SList::setPos( ULONG p )
00147 {
00148 curr = head;
00149 register ULONG i = 0;
00150 pos = 0;
00151
00152 for( ; ( curr != NULL ) && ( i < p ); i++, pos++ )
00153 {
00154 curr = curr->next;
00155 }
00156 }
00157
00158 void SList::setValue( Elem val )
00159 {
00160 assert( isInList() );
00161 curr->next->element = val;
00162 }
00163
00164 Elem SList::currValue() const
00165 {
00166 assert( isInList() );
00167 return curr->next->element;
00168 }
00169
00170 Elem SList::getValue() const
00171 {
00172 assert( isInList() );
00173 return curr->next->element;
00174 }
00175
00176 inline BOOL SList::isInList() const
00177 {
00178 return ( (curr != NULL) && (curr->next != NULL) );
00179 }
00180
00181
00182 long SList::find( Elem item )
00183 {
00184 assert( !isEmpty() );
00185
00186 SLink* temp = curr;
00187 ULONG counter = 0;
00188
00189 if ( curr == head || curr == NULL )
00190 {
00191 curr = head->next;
00192 pos = 0;
00193 }
00194
00195 for ( ; isInList(); curr = curr->next, pos++ )
00196 {
00197 if ( curr->element == item )
00198 {
00199 return pos;
00200 }
00201 }
00202
00203 curr = temp;
00204 return -1;
00205 }
00206
00207 inline BOOL SList::isEmpty() const
00208 {
00209 return ( head->next == NULL || nbElements < 1 );
00210 }
00211
00212
00213 void SList::display()
00214 {
00215 if ( curr == head ) return;
00216
00217 SLink* temp = curr;
00218 curr = head->next;
00219
00220 printf( "===========================================\n" );
00221
00222 while ( curr != NULL )
00223 {
00224 printf( "%d \t", curr->element );
00225
00226 if ( curr->next == NULL )
00227 {
00228 printf( "NULL \n" );
00229 }
00230 else
00231 {
00232 printf( "%d \n", curr->next->element );
00233 }
00234
00235 curr = curr->next;
00236 }
00237
00238 printf( "===========================================\n" );
00239
00240 curr = temp;
00241 }
00242
00243 #endif // End of SList.cpp