CLIST 简单代码

原创 2007年09月15日 16:40:00

//****************************************************************************
//
// CLASS COBLIST DEFINATION
//
//****************************************************************************

#include <windows.h>

#define ASSERT

#define POSITION COBNODE*

struct COBNODE
{
 POSITION pNext;
 void*  pItem;
};

class COBLIST
{
protected:
 POSITION m_pHead;
 POSITION m_pTail;
    virtual BOOL Compare(void* pItemToCompare, void* pComparator)
 { return(pItemToCompare == pComparator); };
public:
 COBLIST() : m_pHead(NULL), m_pTail(NULL) { };
    virtual         ~COBLIST();
 
 virtual void *  RemoveAt(POSITION rPos);
    void            EmptyList();
 POSITION     AddTail(void* pItem);
 void *      GetTail();
 void *      GetNext(POSITION& rPos);
    void *          SafeGetFromPosition(POSITION rPos);
    POSITION        GetPosition(void* pItem);
    POSITION        Lookup(void* pComparator);
 POSITION     GetHeadPosition()  { return (m_pHead); };
 POSITION     GetTailPosition()  { return (m_pTail); };
 BOOL      IsEmpty()          { return (!m_pHead); };
#ifdef DEBUG
 void *      GetHead();
 void *      RemoveHead();
 void *         RemoveTail();
 void *      GetFromPosition(POSITION rPos);
#else
 void *      GetHead()          { return GetFromPosition(GetHeadPosition());};
 void *      RemoveHead()       { return RemoveAt(m_pHead); };
 void *         RemoveTail()       { return RemoveAt(m_pTail); };
 void *      GetFromPosition(POSITION rPos){return (NULL == rPos) ? NULL : (rPos->pItem);};
#endif
};

=================================================================

#include "a.h"

//类的实现如下:
//****************************************************************************
//
// CLASS COBLIST
//
//****************************************************************************


//****************************************************************************
//
// Destructor
//
//****************************************************************************

COBLIST::~COBLIST()
{
    ASSERT(IsEmpty());
}


#ifdef DEBUG
VOID* COBLIST::GetHead()
{
 ASSERT(m_pHead);
 if (NULL == m_pHead)
  return NULL;
 
 return m_pHead->pItem;
}
#endif

VOID* COBLIST::GetTail()
{
 ASSERT(m_pTail);
 if (NULL == m_pTail)
  return NULL;
 
 return m_pTail->pItem;
}


//****************************************************************************
//
// VOID* COBLIST::GetNext(POSITION& rPos)
//
//****************************************************************************

VOID* COBLIST::GetNext(POSITION& rPos)
{
 ASSERT(rPos);
 if (NULL == rPos)
  return NULL;
 
 VOID* pReturn = rPos->pItem;
 rPos = rPos->pNext;
 
 return pReturn;
}


//****************************************************************************
//
// VOID* COBLIST::RemoveAt(POSITION Pos)
//
//****************************************************************************

VOID* COBLIST::RemoveAt(POSITION Pos)
{
 if (NULL == Pos)
  return NULL;
 
 VOID* 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;
   
   if (NULL == m_pHead)
   {
    // Removing the only element!
    m_pTail = NULL;
   }
  }
  else
  {
   POSITION 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;
     break;
    }
    
    pCur = pCur->pNext;
   }
  }
 }
 
 return pReturn;
}


//****************************************************************************
//
// POSITION COBLIST::AddTail(VOID* pItem)
//
//****************************************************************************

POSITION COBLIST::AddTail(VOID* pItem)
{
 POSITION posRet = NULL;
 
 if (m_pTail)
 {
  if (m_pTail->pNext = new COBNODE)
  {
   m_pTail = m_pTail->pNext;
   m_pTail->pItem = pItem;
   m_pTail->pNext = NULL;
  }
  else
   return NULL;
 }
 else
 {
  ASSERT(!m_pHead);
  if (m_pHead = new COBNODE)
  {
   m_pTail = m_pHead;
   m_pTail->pItem = pItem;
   m_pTail->pNext = NULL;
  }
 }
 
 return m_pTail;
}


//****************************************************************************
//
// void COBLIST::EmptyList()
//
//****************************************************************************

void COBLIST::EmptyList()
{
    while (!IsEmpty())
 {
        RemoveAt(GetHeadPosition());
    }
}

#ifdef DEBUG
VOID* COBLIST::RemoveTail()
{
 ASSERT(m_pHead);
 ASSERT(m_pTail);
 if ((NULL == m_pHead) || (NULL == m_pTail))
  return NULL;
 
 return RemoveAt(m_pTail);
}

VOID* COBLIST::RemoveHead()
{
 ASSERT(m_pHead);
 ASSERT(m_pTail);
 
 if ((NULL == m_pHead) || (NULL == m_pTail))
  return NULL;
 
 return RemoveAt(m_pHead);
}

void * COBLIST::GetFromPosition(POSITION Pos)
{
    void * Result = SafeGetFromPosition(Pos);
 ASSERT(Result);
 return Result;
}
#endif /* DEBUG */


//****************************************************************************
//
// POSITION COBLIST::GetPosition(void* _pItem)
//
//****************************************************************************

POSITION COBLIST::GetPosition(void* _pItem)
{
    POSITION    Position = m_pHead;
 
    while (Position)
 {
        if (Position->pItem == _pItem)
  {
            break;
        }
  GetNext(Position);
    }
    return Position;
}


//****************************************************************************
//
// POSITION COBLIST::Lookup(void* pComparator)
//
//****************************************************************************

POSITION COBLIST::Lookup(void* pComparator)
{
    POSITION    Position = m_pHead;
 
    while (Position)
 {
        if (Compare(Position->pItem, pComparator))
  {
            break;
        }
  GetNext(Position);
    }
    return Position;
}


//****************************************************************************
//
// void * COBLIST::SafeGetFromPosition(POSITION Pos)
//
//****************************************************************************

void * COBLIST::SafeGetFromPosition(POSITION Pos)
{
 // Safe way to validate that an entry is still in the list,
 // which ensures bugs that would reference deleted memory,
 // reference a NULL pointer instead
 // (e.g. an event handler fires late/twice).
 // Note that versioning on entries would provide an additional
 // safeguard against re-use of a position.
 // Walk list to find entry.
 
 POSITION PosWork = m_pHead;
 
 while (PosWork)
 {
  if (PosWork == Pos)
  {
   return Pos->pItem;
  }
  GetNext(PosWork);
 }
 return NULL;
}

//****************************************************************************
//
// COBLIST Utility routines
//
//****************************************************************************


//****************************************************************************
//
// POSITION AddNode(PVOID pv, COBLIST ** ppList)
//
// Add a node to a list.
// Initializes the ObList, if necessary.
// Returns the position in the list or NULL if there was a problem.
//
//****************************************************************************

POSITION AddNode(PVOID pv, COBLIST ** ppList)
{
 ASSERT(NULL != ppList);
 if (NULL == ppList)
  return NULL;
 
 if (NULL == *ppList)
 {
  *ppList = new COBLIST();
  if (NULL == *ppList)
   return NULL;
 }
 
 return (*ppList)->AddTail(pv);
}


//****************************************************************************
//
// PVOID RemoveNode(POSITION * pPos, COBLIST *pList)
//
// Remove a node from a list.
// Sets pPos to NULL
//
//****************************************************************************

PVOID RemoveNode(POSITION * pPos, COBLIST *pList)
{
 if ((NULL == pList) || (NULL == pPos))
  return NULL;
 
 PVOID pv = pList->RemoveAt(*pPos);
 *pPos = NULL;
 return pv;
}

//该类使用起来很简单,和MFC的CList差不多。

 

相关文章推荐

IBM CLIST上课课件

  • 2009年08月29日 10:02
  • 80KB
  • 下载

CLIST作为函数参数示例

  • 2015年02月12日 10:00
  • 29KB
  • 下载

VC中CList用法 (转)

初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的Collect类的使用产生了惧怕。以下,就个人经历而言,告诉大家如何使用CList。 ...

CList的使用

  • 2014年07月16日 08:30
  • 2.26MB
  • 下载

CEDIT与CLIST控件拖拽功能

文章原文地址是:http://blog.csdn.net/starlee/archive/2007/01/03/1472710.aspx我只是摘抄。  现在有很多软件都支持拖拽功能,就是用鼠标拖着文件...

Clist的使用

  • 2014年04月21日 16:21
  • 34KB
  • 下载

Clist CArray

CArray       CArray   提供了规则数组不具备的灵活性,但是程序可能不需要它。如果知道数组的特定限制,反而可以使用全局固定数组。如果使用   CArray,当需要重新分配时,使用  ...

CArray,CMap,CList 速度比较

转自:http://blog.csdn.net/scollins/archive/2010/05/13/5581365.aspx1. 数组--CArray   访问方法及效率和普通的数组一样,比普通数...

VC中CList用法

CList是一个双向链表类。 1、头文件名不可少 Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。 2、理解CList的声明和构造方法 CList的声明...
  • heary29
  • heary29
  • 2015年04月21日 09:58
  • 214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CLIST 简单代码
举报原因:
原因补充:

(最多只允许输入30个字)