?? t_list.hpp
字號(hào):
/* 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: 析構(gòu)鏈表時(shí)刪除節(jié)點(diǎn)的數(shù)據(jù)
//0: 析構(gòu)鏈表時(shí)保留節(jié)點(diǎn)的數(shù)據(jù)
public:
//--------------------------------------------------------------------------
// 構(gòu)造函數(shù) ,缺省刪除節(jié)點(diǎn)標(biāo)志為0
//--------------------------------------------------------------------------
T_LIST( short bflag = 0 ) : m_pHead( NULL ), m_pTail( NULL ), m_pCur( NULL )
{
bdeleteflag = bflag ;
};
//--------------------------------------------------------------------------
// 析構(gòu)函數(shù),清除鏈表,釋放鏈表的數(shù)據(jù)成員
//--------------------------------------------------------------------------
~T_LIST()
{
EmptyList();
};
//--------------------------------------------------------------------------
// IsEmpty()
// 是否空表?
//--------------------------------------------------------------------------
inline bool IsEmpty()
{
return ( !m_pHead ? true : false );
};
//--------------------------------------------------------------------------
// SetDeleteFlag( short b )
// 設(shè)置刪除標(biāo)志
//--------------------------------------------------------------------------
inline void SetDeleteFlag( short b )
{
bdeleteflag = b ;
};
//--------------------------------------------------------------------------
// TYPE* Head()
// 返回頭節(jié)點(diǎn)對(duì)應(yīng)的值
//--------------------------------------------------------------------------
inline TYPE* Head()
{
if ( m_pHead )
return m_pHead -> pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// TYPE* Tail()
// 返回尾節(jié)點(diǎn)的數(shù)據(jù)成員值
//--------------------------------------------------------------------------
inline TYPE* Tail()
{
if ( m_pTail )
return m_pTail->pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// inline void GoHead()
// 重置光標(biāo)
//--------------------------------------------------------------------------
inline void GoHead()
{
m_pCur = m_pHead;
}
//--------------------------------------------------------------------------
// TYPE* Next()
// 返回當(dāng)前數(shù)據(jù)成員值,然后光標(biāo)向后移動(dòng)一個(gè)位置
//--------------------------------------------------------------------------
inline TYPE* Next()
{
if ( m_pCur == NULL )
return NULL;
TYPE* pReturn = m_pCur->pItem;
m_pCur = m_pCur->pNext;
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* Current()
// 返回當(dāng)前數(shù)據(jù)成員值
//--------------------------------------------------------------------------
inline TYPE* Current()
{
if ( m_pCur == NULL )
return NULL;
TYPE* pReturn = m_pCur->pItem;
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* Position()
// 返回當(dāng)前節(jié)點(diǎn)指針
//--------------------------------------------------------------------------
inline T_NODE* Position()
{
return m_pCur;
};
//--------------------------------------------------------------------------
// bool IsTail()
// 判斷當(dāng)前節(jié)點(diǎn)是否為尾節(jié)點(diǎn),如果是,返回TRUE,否則返回FALSE
//--------------------------------------------------------------------------
inline bool IsTail()
{
return ( m_pCur == m_pTail ? 1 : 0 ) ;
};
//--------------------------------------------------------------------------
// TYPE* RemoveCursor()
// 返回當(dāng)前數(shù)據(jù)成員值,刪除當(dāng)前節(jié)點(diǎn)
//--------------------------------------------------------------------------
inline TYPE* RemoveCursor()
{
T_NODE* pTemp = m_pCur;
m_pCur = m_pCur->pNext;
return RemoveAt( pTemp );
};
//--------------------------------------------------------------------------
// T_NODE* AddTail( TYPE* pItem )
// 在尾部添加一個(gè)節(jié)點(diǎn),數(shù)據(jù)成員為pItem
// 注意:節(jié)點(diǎn)并不申請(qǐng)數(shù)據(jù)成員的空間,而是直接用外面的數(shù)據(jù)。所以在外面,不能
// 刪除數(shù)據(jù)成員。可以通過RemoveAt( POSITION ) 刪除節(jié)點(diǎn),并返回?cái)?shù)據(jù)成員指針
// 或者調(diào)用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 )
// 在給定節(jié)點(diǎn)之前添加一個(gè)節(jié)點(diǎn),數(shù)據(jù)成員為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 )
// 在給定節(jié)點(diǎn)之后添加一個(gè)節(jié)點(diǎn),數(shù)據(jù)成員為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 )
{//在結(jié)尾
pPosi -> pNext = pTemp ;
m_pTail = pTemp ;
}
else
{//在中間
pTemp -> pNext = pPosi -> pNext ;
pPosi -> pNext = pTemp ;
}
return 1;
};
//--------------------------------------------------------------------------
// EmptyList()
// 清空列表,如果bdeleteflag!=0不刪除數(shù)據(jù)成員,否則刪除成員數(shù)據(jù)
//--------------------------------------------------------------------------
inline void EmptyList()
{
while ( !IsEmpty() )
{
if( bdeleteflag != 0 )
delete RemoveAt( GetHeadPosition() );
else
RemoveAt( GetHeadPosition() );
}
m_pHead = NULL;
m_pTail = NULL;
m_pCur = NULL;
};
//--------------------------------------------------------------------------
// EmptyListWithDelete()
// 清空列表,刪除數(shù)據(jù)成員,
//--------------------------------------------------------------------------
inline void EmptyListWithDelete()
{
while ( !IsEmpty() )
{
delete RemoveAt( GetHeadPosition() );
}
m_pHead = NULL;
m_pTail = NULL;
m_pCur = NULL;
};
//--------------------------------------------------------------------------
// TYPE* RemoveHead()
// 刪除頭節(jié)點(diǎn)
//--------------------------------------------------------------------------
inline TYPE* RemoveHead()
{
if ( m_pHead == NULL )
return NULL;
else
return RemoveAt( m_pHead );
};
//--------------------------------------------------------------------------
// TYPE* RemoveHead()
// 刪除頭節(jié)點(diǎn)
//--------------------------------------------------------------------------
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()
// 取頭節(jié)點(diǎn)位置
//--------------------------------------------------------------------------
inline T_NODE* GetHeadPosition()
{
return m_pHead;
};
//--------------------------------------------------------------------------
// inline T_NODE* GetTailPosition()
// 取尾節(jié)點(diǎn)位置
//--------------------------------------------------------------------------
inline T_NODE* GetTailPosition()
{
return m_pTail;
};
//--------------------------------------------------------------------------
// virtual TYPE* RemoveAt( T_NODE* Pos )
// 刪除指定位置的節(jié)點(diǎn),返回節(jié)點(diǎn)對(duì)應(yīng)的值
//--------------------------------------------------------------------------
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 );
// 返回指定節(jié)點(diǎn)數(shù)據(jù)成員值,然后光標(biāo)向后移動(dòng)一個(gè)位置
//--------------------------------------------------------------------------
inline TYPE* GetNext( T_NODE*& rPos )
{
TYPE* pReturn = NULL;
if ( rPos )
{
rPos = rPos->pNext;
pReturn = rPos->pItem;
}
return pReturn;
};
//--------------------------------------------------------------------------
// TYPE* GetFromPosition( T_NODE* rPos )
// 不驗(yàn)證節(jié)點(diǎn)的正確性,根據(jù)節(jié)點(diǎn)位置取對(duì)應(yīng)的數(shù)據(jù)成員值
//--------------------------------------------------------------------------
inline TYPE* GetFromPosition( T_NODE* rPos )
{
if ( rPos )
return rPos->pItem;
else
return NULL;
};
//--------------------------------------------------------------------------
// SafeGetFromPosition( T_NODE* rPos );
// 驗(yàn)證節(jié)點(diǎn)的正確性,然后根據(jù)節(jié)點(diǎn)位置取對(duì)應(yīng)的數(shù)據(jù)成員值.
//--------------------------------------------------------------------------
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__
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -