C++ 雙向鏈表類

來源:互聯網
上載者:User

 說明:本文最早發佈於 http://blog.csdn.net/Saimen 現轉到本人網站,如果其它站轉載,請標明出處為 http://www.5d232.com

本文介紹並實現了一個基於雙向鏈表的C++類,命名為 CPtrArray, 用於儲存動態產生的資料,相當於一個動態列表,可以管理動態分配的對象執行個體。

    用過VC的人可能都用過其中各種各樣的Array類,在我也常用到,這讓我編寫程式方便了很多。
  
    最近這段時間在開發一個嵌入式的組態系統,使用DOS5.0,開發環境為Borlandc 3.1。為了在這樣一個系統上實現我的組態功能,可是費了我不少心事設計,其中一項就是要解決畫面的顯示問題。組態系統要求使用者自己設計畫面,那麼我們就來設計一個可以修改的監控畫面,在VC開發後台時我使用Array類來儲存監控畫面的每一個對象,可是在BC31中呢,多少年都沒有用過它了,我不知道它是不是也有Array類,有的話,這個類應該怎麼用,與其再尋找學習,不如自己動手編寫一個,看樣子,我是一個標準的CODE MAN,不管什麼東東總想自己來寫。
    不過還好,當年在學校的中資料結構還是沒有白學。問題很快得到解決。

    我使用了一個雙向鏈表解決這個問題,用它來實現結點的添加和刪除實在太方便了。

    下面就是這個類的原始碼部分,在此貼出,也希望和我一樣,愛號、狂熱於程式設計的朋友批抨指正。

首先貼上來的是我的一個資料類型定義,習慣了VC,就按VC的格式轉換一下,當然,有經驗的一看就知道是學UCOS的,呵呵,這點我承認,偉大的思想家魯迅教育我們:要取其精華

/*
********************************************************
*
*        (c) Copyright 2003,Hu Wenjin
*             All Right Reserved
*
*
* File: datadef.h
* Auther: Hu Wenjin
* Data: 11.4.2003
*********************************************************
*/
/*
*********************************************************
* DATA TYPES DEFINE
*********************************************************
*/
#if !defined( _DATADEF_H )
#define _DATADEF_H

typedef signed long   INT;
typedef unsigned long       DWORD;
typedef INT                 BOOL;
typedef unsigned char  bool;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef unsigned long  UINT;
typedef unsigned long  DWORD;
typedef DWORD    COLORREF;
typedef char    CHAR;
typedef short    SHORT;
typedef long    LONG;
typedef unsigned char  INT8U;
typedef signed   char  INT8S;
typedef unsigned int  INT16U;
typedef signed   int  INT16S;
typedef unsigned long  INT32U;
typedef signed   long  INT32S;
typedef char*    LPCTSTR;
#define TRUE   1
#define FALSE  0
#define true   1
#define false  0

typedef struct
{
 LONG left;
 LONG top;
 LONG right;
 LONG bottom;
}RECT;

#endif

再接下來的,當然是  .h 檔案了

#if !defined( _PTRARRAY_H )
#define _PTRARRAY_H
#include "datadef.h"
/*
*************************************************************************

  FILE:  PtrArray.h
  AUTHER: HuWenjin
  DATA:  9.27,2004

  Discrption:
 
 Modification:
 1.

*************************************************************************
*/

typedef struct
{
 void* m_pObj;   //結點中包含的資料指標
 void* m_pParent;  //上一個結點
 void* m_pChild;  //下一個結點
 int  m_nIndex;  //本結點在隊列中的位置
 BOOL m_bDeleted;  //本結點是否被刪除
}ST_OBJ;

class CJinPtrArray
{
public:
 CJinPtrArray( );
 virtual ~CJinPtrArray( );

public:
 void* SetAt(int nIndex,void* pObj); //修改指定點的對象指標為新指標
 int GetCount( ); //擷取總數
 int Append( void* pObj );  //添加一個,從刪除隊列中添加,如果沒有則再重建
 int DeleteAt( int nIndex );  //刪除指定,沒有釋放記憶體,保留下次使用
 void* GetAt( int nIndex );  //擷取指定的對象
 int RemoveAll( ); //清空全部結點資料,結點沒有釋放記憶體,保留下次使用

protected:
 ST_OBJ* m_pData; //對象指標
 int  m_nCount; //對象總數

protected:
 int MemFree( );  //從記憶體中刪除所有的資料
 void* Sort( int nIndex = 0 ); //刪除對象後排序,重設對列中的序號
};

#endif

最後就是CPP檔案了

/**************************************************************************

  FILE: PtrArray.CPP
  AUTHER: HuWenjin
  DATA:  9.27,2004

  Discrption:

 Modification:
 1.

 

**************************************************************************/
#include "Includes.h"
#include "PtrArray.h"

///////////////////////////////////////////////////////////////////////////
// CJinPtrArray

CJinPtrArray::CJinPtrArray( )
{
 m_pData = NULL;
 m_nCount = 0 ;
}

CJinPtrArray::~CJinPtrArray()
{
 MemFree( );
}

int CJinPtrArray::MemFree( )
{
 ST_OBJ* pObj;
 ST_OBJ* pObjNext;

 pObj = m_pData;
 while( 1 )
 {
  if( !pObj )
   break;
  pObjNext = (ST_OBJ*)pObj->m_pChild;
  delete pObj;
  pObj = pObjNext;
 }
 
 return 0;
}

int CJinPtrArray::GetCount(  )
{
 return m_nCount;
}

int CJinPtrArray::RemoveAll( )
{
 ST_OBJ* pObj = m_pData;

 while( 1 )
 {
  if( !pObj )
   break; 
  pObj->m_bDeleted = TRUE;
  pObj->m_nIndex = -1;
  pObj = (ST_OBJ*)pObj->m_pChild;
 }
 m_nCount = 0 ;
 return 0;
}

int CJinPtrArray::Append( void* pObjAdd )
{
 ST_OBJ* pObj = m_pData;

 if( !pObjAdd )
  return -1;
 // 尋找是否有空閑記憶體區,如果有則加入
 while( 1 )
 {
  if( !pObj )
   break;

  if( pObj->m_bDeleted == TRUE )
  {
   pObj->m_pObj = pObjAdd;
   pObj->m_bDeleted = FALSE;
   pObj->m_nIndex = m_nCount;
   m_nCount ++;
   return ( m_nCount-1 );
  }
  pObj = (ST_OBJ*)pObj->m_pChild;
 }

 // 沒有空閑記憶體區,則再申請1個資料區加入
 pObj = NULL;
 pObj = new ST_OBJ;
 if( !pObj )
  return -1;
 
 pObj->m_bDeleted = FALSE;
 pObj->m_pObj = pObjAdd;
 pObj->m_nIndex = m_nCount;
 m_nCount ++;
 
 pObj->m_pParent = NULL;
 pObj->m_pChild = m_pData;
 if( m_pData )
  m_pData->m_pParent = pObj;

 // 儲存當前的指標做為 ROOT 指標
 m_pData = pObj;

 return pObj->m_nIndex;
}

int CJinPtrArray::DeleteAt( int nIndex )
{
 ST_OBJ* pObj = m_pData;

 while( 1 )
 {
  if( !pObj )
   break;

  if( pObj->m_nIndex == nIndex )
  {
   pObj->m_bDeleted = TRUE;
   pObj->m_nIndex = -1;
   m_nCount --;
   //刪除對象後應重新排序設定新序號
   Sort(nIndex);
   return m_nCount;
  }
  pObj = (ST_OBJ*)pObj->m_pChild;
 }
 return -1;
}

void* CJinPtrArray::GetAt( int nIndex )
{
 ST_OBJ* pObj = m_pData;

 while( 1 )
 {
  if( !pObj )
   break;
  if( pObj->m_nIndex == nIndex )
   return pObj->m_pObj;

  pObj = (ST_OBJ*)pObj->m_pChild;
 }
 return NULL;
}

void* CJinPtrArray::Sort( int nIndex )
{
 ST_OBJ* pObj = m_pData;

 while( 1 )
 {
  if( !pObj )
   break;

  if( pObj->m_nIndex < nIndex )
   goto NEXT_TIME;
  else if( pObj->m_nIndex > nIndex )
   pObj->m_nIndex -- ; 
NEXT_TIME:
  pObj = (ST_OBJ*)pObj->m_pChild;
 }
 return m_pData;
}

void* CJinPtrArray::SetAt(int nIndex, void *pTagObj)
{
 ST_OBJ* pObj = m_pData;
 void* pOldTagObj = NULL;
 
 while( 1 )
 {
  if( !pObj )
   break;
  if( pObj->m_nIndex == nIndex )
  {
   pOldTagObj = pObj->m_pObj;
   pObj->m_pObj = pTagObj;
   return pOldTagObj;
  }
 
  pObj = (ST_OBJ*)pObj->m_pChild;
 }
 return NULL;
}

    好了,大家可以看到整個程式並不是很長,應該還是很好理解的。
    在記憶體使用量上,如果使用者指派了20個空間,然後又刪除的話,程式並沒有馬上釋放記憶體,只是修改它的標識,因為使用者可能馬上又要用到多出的空間。
    所有的空間,在對象析構時釋放。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.