📄 t_list.hpp
字号:
/* Copyright( C ) 2000 by JiangSu Bell Software CO.,LTD. */
/*
****************************************************************************
Content: 单向链表处理
Name: T_LIST.H Version: 1.0.0
Created by: CaoGuiRong Date: 2000-08-11
Comment: 链表处理模板类。
All rights reserved
****************************************************************************
*/
#ifndef __T_LIST_H__
#define __T_LIST_H__
template < class TYPE >
class T_LIST
{
public:
struct T_NODE
{
T_NODE* pNext;
TYPE* pItem;
};
protected:
T_NODE* m_pHead;
T_NODE* m_pTail;
T_NODE* m_pCur;
short bdeleteflag; //1: 析构链表时删除节点的数据
//0: 析构链表时保留节点的数据
public:
//--------------------------------------------------------------------------
// 构造函数 ,缺省删除节点标志为0
//--------------------------------------------------------------------------
T_LIST( short bflag = 0 ) : m_pHead( NULL ), m_pTail( NULL ), m_pCur( NULL )
{
bdeleteflag = bflag ;
};
//--------------------------------------------------------------------------
// 析构函数,清除链表,释放链表的数据成员
//--------------------------------------------------------------------------
~T_LIST()
{
EmptyList();
};
//--------------------------------------------------------------------------
// IsEmpty()
// 是否空表?
//--------------------------------------------------------------------------
inline bool IsEmpty()
{
return ( !m_pHead ? true : false );
};
//--------------------------------------------------------------------------
// SetDeleteFlag( short b )
// 设置删除标志
//--------------------------------------------------------------------------
inline void SetDeleteFlag( short b )
{
bdeleteflag = b ;
};
//--------------------------------------------------------------------------
// TYPE* Head()
// 返回头节点对应的值
//--------------------------------------------------------------------------
inline TYPE* Head()
{
if ( m_pHead )
return m_pHead -> pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// TYPE* Tail()
// 返回尾节点的数据成员值
//--------------------------------------------------------------------------
inline TYPE* Tail()
{
if ( m_pTail )
return m_pTail->pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// inline void GoHead()
// 重置光标
//--------------------------------------------------------------------------
inline void GoHead()
{
m_pCur = m_pHead;
}
//--------------------------------------------------------------------------
// TYPE* Next()
// 返回当前数据成员值,然后光标向后移动一个位置
//--------------------------------------------------------------------------
inline TYPE* Next()
{
if ( m_pCur == NULL )
return NULL;
TYPE* pReturn = m_pCur->pItem;
m_pCur = m_pCur->pNext;
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* Current()
// 返回当前数据成员值
//--------------------------------------------------------------------------
inline TYPE* Current()
{
if ( m_pCur == NULL )
return NULL;
TYPE* pReturn = m_pCur->pItem;
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* Position()
// 返回当前节点指针
//--------------------------------------------------------------------------
inline T_NODE* Position()
{
return m_pCur;
};
//--------------------------------------------------------------------------
// bool IsTail()
// 判断当前节点是否为尾节点,如果是,返回TRUE,否则返回FALSE
//--------------------------------------------------------------------------
inline bool IsTail()
{
return ( m_pCur == m_pTail ? 1 : 0 ) ;
};
//--------------------------------------------------------------------------
// TYPE* RemoveCursor()
// 返回当前数据成员值,删除当前节点
//--------------------------------------------------------------------------
inline TYPE* RemoveCursor()
{
T_NODE* pTemp = m_pCur;
m_pCur = m_pCur->pNext;
return RemoveAt( pTemp );
};
//--------------------------------------------------------------------------
// T_NODE* AddTail( TYPE* pItem )
// 在尾部添加一个节点,数据成员为pItem
// 注意:节点并不申请数据成员的空间,而是直接用外面的数据。所以在外面,不能
// 删除数据成员。可以通过RemoveAt( POSITION ) 删除节点,并返回数据成员指针
// 或者调用EmptyList()来清空
//--------------------------------------------------------------------------
inline bool AddTail( TYPE* pItem )
{
if ( m_pTail )
{
m_pTail->pNext = new T_NODE ;
if ( m_pTail -> pNext )
m_pTail = m_pTail->pNext;
}
else
{
m_pHead = new T_NODE ;
if ( m_pHead != NULL )
m_pTail = m_pHead;
}
if ( m_pTail )
{
m_pTail->pItem = pItem;
m_pTail->pNext = NULL;
}
return ( m_pTail ? true : false );
};
//--------------------------------------------------------------------------
// bool AddBefore( T_NODE* pPosi )
// 在给定节点之前添加一个节点,数据成员为pItem
//--------------------------------------------------------------------------
inline bool AddBefore( T_NODE* pPosi,TYPE* pItem )
{
if( !pPosi )
return 0 ;
T_NODE *pTemp = new T_NODE ;
pTemp -> pItem = pItem ;
pTemp -> pNext = NULL ;
if( m_pHead == pPosi )
{//在头上
pTemp -> pNext = m_pHead ;
m_pHead = pTemp ;
}
else
{//在中间
T_NODE *pcur = m_pHead ;
while( pcur -> pNext != pPosi && pcur )
{
pcur = pcur->pNext ;
}
if( pcur )
{
pcur -> pNext = pTemp ;
pTemp -> pNext = pPosi ;
}
else
return 0 ; //cao 2001.4
}
return 1;
};
//--------------------------------------------------------------------------
// bool AddAfter( T_NODE* pPosi,TYPE* pItem )
// 在给定节点之后添加一个节点,数据成员为pItem,较快
//--------------------------------------------------------------------------
inline bool AddAfter( T_NODE* pPosi,TYPE* pItem )
{
if( pPosi == NULL )
return 0 ;
T_NODE *pTemp = new T_NODE ;
pTemp -> pItem = pItem ;
pTemp -> pNext = NULL ;
if( m_pTail == pPosi )
{//在结尾
pPosi -> pNext = pTemp ;
m_pTail = pTemp ;
}
else
{//在中间
pTemp -> pNext = pPosi -> pNext ;
pPosi -> pNext = pTemp ;
}
return 1;
};
//--------------------------------------------------------------------------
// EmptyList()
// 清空列表,如果bdeleteflag!=0不删除数据成员,否则删除成员数据
//--------------------------------------------------------------------------
inline void EmptyList()
{
while ( !IsEmpty() )
{
if( bdeleteflag != 0 )
delete RemoveAt( GetHeadPosition() );
else
RemoveAt( GetHeadPosition() );
}
m_pHead = NULL;
m_pTail = NULL;
m_pCur = NULL;
};
//--------------------------------------------------------------------------
// EmptyListWithDelete()
// 清空列表,删除数据成员,
//--------------------------------------------------------------------------
inline void EmptyListWithDelete()
{
while ( !IsEmpty() )
{
delete RemoveAt( GetHeadPosition() );
}
m_pHead = NULL;
m_pTail = NULL;
m_pCur = NULL;
};
//--------------------------------------------------------------------------
// TYPE* RemoveHead()
// 删除头节点
//--------------------------------------------------------------------------
inline TYPE* RemoveHead()
{
if ( m_pHead == NULL )
return NULL;
else
return RemoveAt( m_pHead );
};
//--------------------------------------------------------------------------
// TYPE* RemoveHead()
// 删除头节点
//--------------------------------------------------------------------------
inline void ExportAll( char* pctext = "my_log_.txt" )
{//遍历
FILE *p_file = fopen( pctext,"a+" ) ;
if( p_file )
{
fprintf( p_file,"\r\n\r\n\r\n================== Begin " ) ;
GoHead() ;
while( Position() )
{
#ifdef __CAO__
fprintf( p_file,"\n %s ", Current() -> Output() ) ;
#endif
// fprintf( p_file,"\n %s ", Current() -> Output() ) ;
Next() ;
}
fprintf( p_file,"\r\n================== End " ) ;
}
if( p_file )
fclose( p_file ) ;
};
//--------------------------------------------------------------------------
//inline T_NODE* GetHeadPosition()
// 取头节点位置
//--------------------------------------------------------------------------
inline T_NODE* GetHeadPosition()
{
return m_pHead;
};
//--------------------------------------------------------------------------
// inline T_NODE* GetTailPosition()
// 取尾节点位置
//--------------------------------------------------------------------------
inline T_NODE* GetTailPosition()
{
return m_pTail;
};
//--------------------------------------------------------------------------
// virtual TYPE* RemoveAt( T_NODE* Pos )
// 删除指定位置的节点,返回节点对应的值
//--------------------------------------------------------------------------
inline virtual TYPE* RemoveAt( T_NODE* Pos )
{
TYPE* pReturn = NULL;
if ( m_pHead )
{
if ( m_pHead == Pos )
{
// Removing the first element in the list
m_pHead = Pos->pNext;
pReturn = Pos->pItem;
delete Pos;
Pos = NULL;
if ( NULL == m_pHead )
{
// Removing the only element!
m_pTail = NULL;
}
}
else
{
T_NODE* pCur = m_pHead;
while ( pCur && pCur->pNext )
{
if ( pCur->pNext == Pos )
{
// Removing
pCur->pNext = Pos->pNext;
if ( m_pTail == Pos )
{
m_pTail = pCur;
}
pReturn = Pos->pItem;
delete Pos;
}
pCur = pCur->pNext;
}
}
}
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* GetNext( T_NODE*& rPos );
// 返回指定节点数据成员值,然后光标向后移动一个位置
//--------------------------------------------------------------------------
inline TYPE* GetNext( T_NODE*& rPos )
{
TYPE* pReturn = NULL;
if ( rPos )
{
rPos = rPos->pNext;
pReturn = rPos->pItem;
}
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* GetFromPosition( T_NODE* rPos )
// 不验证节点的正确性,根据节点位置取对应的数据成员值
//--------------------------------------------------------------------------
inline TYPE* GetFromPosition( T_NODE* rPos )
{
if ( rPos )
return rPos->pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// SafeGetFromPosition( T_NODE* rPos );
// 验证节点的正确性,然后根据节点位置取对应的数据成员值.
//--------------------------------------------------------------------------
inline TYPE* SafeGetFromPosition( T_NODE* Pos )
{
T_NODE* PosWork = m_pHead;
while ( PosWork )
{
if ( PosWork == Pos )
{
return Pos->pItem;
}
GetNext( PosWork );
}
return NULL;
}
};
#endif //__T_LIST_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -