17#ifndef __XB_XBLNKLST_H__
18#define __XB_XBLNKLST_H__
20#ifdef XB_LINKLIST_SUPPORT
25template<
class xbNodeType>
26class XBDLLEXPORT xbLinkList {
31 xbLinkListNode<xbNodeType> *GetHeadNode()
const;
32 xbLinkListNode<xbNodeType> *GetEndNode()
const;
33 xbLinkListNode<xbNodeType> *GetNodeForNo( xbUInt32 ulNodeNo )
const;
36 xbUInt32 GetNodeCnt ()
const;
37 xbInt16 InsertAtEnd (
const xbNodeType &xbLLN );
38 xbInt16 InsertAtFront (
const xbNodeType &xbLLN );
39 xbInt16 RemoveByVal (
const xbNodeType &xbLLN );
40 xbInt16 RemoveFromEnd ();
41 xbInt16 RemoveFromEnd ( xbNodeType &xbLLN );
42 xbInt16 RemoveFromFront( xbNodeType &xbLLN );
43 xbInt16 SearchFor (
const xbNodeType &xbLLN );
47 xbLinkListNode<xbNodeType> *llStartPtr;
48 xbLinkListNode<xbNodeType> *llEndPtr;
51template<
class xbNodeType>
52xbLinkList<xbNodeType>::xbLinkList(){
58template<
class xbNodeType>
59xbLinkList<xbNodeType>::~xbLinkList(){
63template<
class xbNodeType>
64void xbLinkList<xbNodeType>::Clear(){
65 xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;
66 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
68 cPtr = cPtr->GetNextNode();
77template<
class xbNodeType>
78xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetHeadNode()
const{
82template<
class xbNodeType>
83xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetEndNode()
const{
88template<
class xbNodeType>
89xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetNodeForNo( xbUInt32 ulNo )
const{
91 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
93 for( i = 0; i < ulNo && i < ulNodeCnt; i++ )
94 cPtr = cPtr->GetNextNode();
104template<
class xbNodeType>
105xbUInt32 xbLinkList<xbNodeType>::GetNodeCnt()
const{
109template<
class xbNodeType>
110xbInt16 xbLinkList<xbNodeType>::InsertAtFront(
const xbNodeType & ntKey ){
112 xbLinkListNode<xbNodeType> *p =
new xbLinkListNode<xbNodeType>( ntKey );
117 llStartPtr->SetPrevNode( p );
118 p->SetNextNode( llStartPtr );
128template<
class xbNodeType>
129xbInt16 xbLinkList<xbNodeType>::InsertAtEnd(
const xbNodeType & ntKey ){
131 xbLinkListNode<xbNodeType> *p =
new xbLinkListNode<xbNodeType>( ntKey );
136 llEndPtr->SetNextNode( p );
137 p->SetPrevNode( llEndPtr );
150template<
class xbNodeType>
151xbInt16 xbLinkList<xbNodeType>::RemoveByVal(
const xbNodeType & ntKey ){
153 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
154 xbLinkListNode<xbNodeType> *prevPtr = NULL;
156 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
157 if( currPtr->GetKey() == ntKey ){
158 if( prevPtr == NULL ){
159 llStartPtr = currPtr->GetNextNode();
161 llStartPtr->SetPrevNode( NULL );
167 prevPtr->SetNextNode( currPtr->GetNextNode());
168 if( currPtr->GetNextNode())
169 currPtr->GetNextNode()->SetPrevNode( prevPtr );
176 currPtr = currPtr->GetNextNode();
182template<
class xbNodeType>
183xbInt16 xbLinkList<xbNodeType>::RemoveFromFront( xbNodeType & ntKey ){
187 xbLinkListNode<xbNodeType> *p = llStartPtr;
188 llStartPtr = p->GetNextNode();
190 llStartPtr->SetPrevNode( NULL );
198template<
class xbNodeType>
199xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd( xbNodeType & ntKey ){
203 xbLinkListNode<xbNodeType> *p = llEndPtr;
204 if( p->GetPrevNode()){
205 llEndPtr = p->GetPrevNode();
206 llEndPtr->SetNextNode( NULL );
219template<
class xbNodeType>
220xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd(){
224 xbLinkListNode<xbNodeType> *p = llEndPtr;
225 if( p->GetPrevNode()){
226 llEndPtr = p->GetPrevNode();
227 llEndPtr->SetNextNode( NULL );
240template<
class xbNodeType>
241xbInt16 xbLinkList<xbNodeType>::SearchFor(
const xbNodeType & ntKey ){
243 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
244 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
245 if( cPtr->GetKey() == ntKey )
247 cPtr = cPtr->GetNextNode();
Definition: xbdate.cpp:19
#define XB_INVALID_NODELINK
Definition: xbretcod.h:28
#define XB_NOT_FOUND
Definition: xbretcod.h:40
#define XB_NO_ERROR
Definition: xbretcod.h:24
#define XB_NO_MEMORY
Definition: xbretcod.h:25