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差不多。

 

Clist循环链表的实现

// // Clist.h // Algorithms&Data_structures // // Created by TTc on 15-2-2. // Copyright (c) 201...
  • liutianshx2012
  • liutianshx2012
  • 2016年05月25日 16:45
  • 338

MFC中CList类使用方法

CList是一个双向链表类。 1:Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。 2、理解CList的声明和构造方法 CList的声明如下: temp...
  • u011164819
  • u011164819
  • 2016年10月10日 18:08
  • 3467

扩展CList类加入排序功能

这里实现了两种排序:链表内部排序和链表外部排序: 链表外部排序不会真实改变数据顺序:   //在链表外部进行排序,不会直接影响到链表内的数据排序;实现方法是 申请一段对空间数组,用来存放指针,这...
  • djb100316878
  • djb100316878
  • 2014年12月10日 13:59
  • 1826

VC++ 文件读取并在CListControl上展示

VC++中对文件读取操作获取文件的pathvoid getPath(){ char filepath[256], sDrive[256], sDir[256], sFname[256], sE...
  • qq_32655383
  • qq_32655383
  • 2016年11月11日 11:04
  • 306

MFC集合类之CList

之前我们先以CStringList为例演示下列成员方法: AddTail, AddHead, GetHeadPosition, GetTailPosition, GetPrev(), GetNe...
  • imxiangzi
  • imxiangzi
  • 2014年10月03日 23:58
  • 546

CList源码解析

(1)CList Class Members Construction CList Constructs an empty ordered list. ...
  • q_023
  • q_023
  • 2017年03月30日 13:17
  • 244

VC中CList用法

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

CList的用法理解

CList是一个双向链表类。CList的优势是快速灵活的插入和删除。但是在访问元素的时候,会多一个N的时间复杂度。在元素很多的时候,建议把数据分段存储。 1、包含头文件Afxtempl.h    ...
  • zengweicdut
  • zengweicdut
  • 2013年03月21日 11:08
  • 1061

CList使用说明

http://blog.sina.com.cn/s/blog_70441c8e0101aiwf.html PS:有修订,必须加入MFC库 CList是通用型的列表类,你可以...
  • liups
  • liups
  • 2015年01月09日 23:51
  • 476

MF CListControl 简单功能使用

MF CListControl 简单功能使用   展现演示:   由于初学,就不误导大家了,给出我的代码如下: // TODO: 在此添加额外的初始化代码 AnanlyData.ModifySty...
  • u010236550
  • u010236550
  • 2014年04月12日 17:35
  • 1672
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CLIST 简单代码
举报原因:
原因补充:

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