用C++編寫的基於雙向鏈表的CPtrArray類

來源:互聯網
上載者:User
http://www.zahui.com/html/9/36475.htm
用過VC的人可能都用過其中各種各樣的Array類,在我也常用到,這讓我編寫程式方便了很多。 
    做電力自動化的同行可能都知道,咱這行興組態這個方法,不管理是做什麼軟體,都要組態一把,呵呵,說來笑話,直到今天我也沒有真正的找到組態這一個詞的明確解釋。我一直把它理解為“不需要程式員修改程式,調試人員或使用者就可以完成新的系統監控”。即使是使用DOS5.0做為作業系統的產品或是沒有作業系統的產品,我們一樣要組態、再組態。

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

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

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

/*
********************************************************
*
*        (c) Copyright 2003,Hu Wenjin
*             All Right Reserved
*
*              WRITE USE ANSI c
*
* 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 );  //添加一個,從刪除隊列中添加,如果沒有測再重建5個一組
 int DeleteAt( int nIndex );  //刪除指定,沒有釋放記憶體,保留下次使用(5個結點一組)
 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.