zoukankan      html  css  js  c++  java
  • 用C++编写的基于双向链表的CPtrArray类

    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

  • 相关阅读:
    linux CentOS6.5 yum安装mysql 5.6
    CentOS6.5安装指定的PHP版本(php5.5)(转)
    openssl加密文件过程
    我的投资
    我的unity3d之路_01_序言
    我为什么想转Unity3d
    TensorFlow_01_真正从零开始,TensorFlow详细安装入门图文教程!
    为什么掌握 UML 建模是成为编程高手的一条捷径?
    《UML面向对象建模与设计》一书
    OOAD基本概念
  • 原文地址:https://www.cnblogs.com/cy163/p/308433.html
Copyright © 2011-2022 走看看