⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_list.hpp

📁 联通接收发送新程序
💻 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 + -