⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skyrainreg.h

📁 《数据结构》中二叉树的常用算法的练习。包括排序、兄弟-孩子链表的建立
💻 H
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************\
 *
 *  说明:插入动作的结果状态
 *
 *  iaSameKey  : 存在同样的结点
 *
 *	iaSuccess  : 成功插入
 *
\***************************************************************************/

enum CCreateActive{caExistNoCreate, caNoCreate, caCreated};
/***************************************************************************\
 *
 *  说明:创建主键结点或键值结点动作的结果状态
 *
 *  caExistNoCreate : 已经存在相同的结点不需要再创建
 *
 *	caNoCreate : 没有创建
 *
 *  caCreated  : 已创建一个新的结点
 *
\***************************************************************************/

enum CSearchActive{saUnsuccess, saSuccess, saPrevBig};
/***************************************************************************\
 *
 *  说明:查询动作的结果状态
 *
 *  saUnsuccess: 查询不成功
 *
 *	saSuccess  : 查询成功
 *
 *  saPrevBig  :
 *
\***************************************************************************/

enum CLoadFileActive {lfaFileNotExist, lfaFileVoid, lfaSuccess};
/***************************************************************************\
 *
 *  说明:加载文件动作的结果状态
 *
 *  lfaFileNotExist :  文件不存在
 *
 *	lfaFileVoid: 加载文件失败
 *
 *  lfaSuccess : 加载文件成功
 *
\***************************************************************************/

enum CSearchFlag {sfKey, sfDataName, sfDataValue};
/***************************************************************************\
 *
 *  说明:
 *
 *  sfKey      :
 *
 *	sfDataName :
 *
 *  sfDataValue:
 *
\***************************************************************************/

enum CHaveSubNode {hsnNO, hsnHAVE};
/***************************************************************************\
 *
 *  说明:用来指明主键结点或键值结点链表中是否有子结点
 *
 *  hsnNO      : 没有
 *
 *	hsnHave	   : 有
 *
\***************************************************************************/

enum CCopyType {ctNo, ctKey, ctValue};
/***************************************************************************\
 *
 *  说明:复制数据类型
 *
 *  ctNo       : 表示当前没有任何复制信息
 *
 *	ctKey      : 表示当前复制的为主键
 *
 *  ctValue    : 表示当前复制的为打开主键中的某一个键值
 *
\***************************************************************************/
//---------------------------------------------------------------------------

//
// 基本字符串操作
//

#ifdef  USING_CHAR

#define StrLen(S) (int)strlen(S)
// 如果字符为char格式时用strlen返回字符串的长度
// 如果字符为wchar格式时用wcslen返回字符串的长度

#define CompareName(Key1, Key2) strcmpi((Key1)->Name,(Key2)->Name)
#define CompareStr(Str1, Str2)  strcmpi(Str1,Str2)

#else

#define StrLen(S) (int)wcslen(S)
#define CompareName(Key1, Key2) StrCmp((Key1)->Name,(Key2)->Name)
// 比较两个主键或键值名称的大小的宏
// 若Key1小于Key2 返回-1
// 若Key1等于Key2 返回0
// 若Key1大于Key2 返回1

#endif

//---------------------------------------------------------------------------

void ShowMsg(PSTRTYPE Msg);
void ShowMsg(int Msg);
int  AnsiPos(PSTRTYPE S, STRTYPE C);
void StrCopy(PSTRTYPE &Str1, PSTRTYPE Str2);
void StrNCopy(PSTRTYPE Dest, PSTRTYPE Source, int n);
void StrStartEndCopy(PSTRTYPE &Dest, PSTRTYPE Source, int Start, int End);

//---------------------------------------------------------------------------
namespace SkyRain
{
	// 记录结点信息 NodeType=ntMainKey记录的是主键 NodeType=ntKeyValue是键值
    // 若记录的是主键则StringSize为主键名字符串长度DataSize=-1, 若记录的是键
    // 值StringSize为为键值名字符串长度DataSize为记录键值数据的内存长度。 该
    // 数据类型只有在保存数据到文件中或从文件中加载数据构成二叉树时有用。

    typedef struct CNodeInfo
    {
    	CADataType   DataType;    			// 数据类型
        DWORD        StringSize;        	// 字符串大小
        DWORD        DTByteSize;      		// 记录数据类型的位数,如sizeof(char)
        DWORD        DTByteLen;   			// 数据类型位数的长度
        CHaveSubNode cFlag;             	// 标志是否有孩子结点 0无 1有
        CHaveSubNode sFlag;             	// 标志是否有兄弟结点 0无 1有
        CHaveSubNode vFlag;             	// 标志是否有键值结点 0无 1有
    public:
    	CNodeInfo(void)
        {
        	DataType     = dtBOOL;			// 默认值为逻辑型值 
            DTByteSize	 = 0;
            StringSize   = 0;
            DTByteLen    = 0;
            cFlag        = hsnNO;
            sFlag        = hsnNO;
            vFlag        = hsnNO;
        }
         ~CNodeInfo(void){}
    }CNodeInfo;

    /***************************************************************
    *                                                              *
    *  键值数据结点有2个指针域和2个数据域,其主结构为单链表,每个结  *
    *  点有一个指向该结点信息的指针域。                            *
    *                                                              *
    ***************************************************************/
    typedef struct CValueNode        		// 键值数据结点
    {
    	void       *Data;        			// 键值数据可以指向任何数据类型
        PSTRTYPE    Name;        			// 键值名
        CNodeInfo  *Info;        			// 结点信息
        CValueNode *Next;        			// 兄弟键值结点指针指向下一个结点
    public:
    	CValueNode()
        {
        	Info = new CNodeInfo;
            Data = NULL;
            Next = NULL;
            Name = NULL;
            StrCopy(Name, CREATENEWVALUE);
        }

        ~CValueNode()
        {
        	delete Name;
            delete Data;
			delete Info;
			delete Next;
        }
    }CValueNode;

    /***************************************************************
    *                                                              *
    *  主键结点有5个指针域和2个数据域。                            *
    *                                                              *
    ***************************************************************/
    typedef struct  CKeyNode         		// 主键结点
    {
    	PSTRTYPE    Name;         			// 主键名
        CVisitTag   Visited;     			// 主键访问标示
        CKeyNode   *SubKey;      			// 孩子结点-指向子主键
        CKeyNode   *SibKey;      			// 兄弟结点-指向同一个主键下的兄弟主键
        CKeyNode   *Parent;      			// 双亲结点
        CValueNode *Value;       			// 指向键值结点链表
        CNodeInfo  *Info;        			// 结点信息

    public:
    	CKeyNode(void)
        {
            Visited = vtUNVISITED;
            SubKey  = NULL;
            SibKey  = NULL;
            Parent  = NULL;
            Value   = NULL;
            Info    = NULL;
            Name    = NULL;
            
            StrCopy(Name, CREATENEWKEY);
        }
				
        ~CKeyNode(void)
        {
        	delete Name;
            delete SubKey;
			delete SibKey;
			delete Parent;
			delete Value;
			delete Info;
        }
    }CKeyNode;
}// End of namespace SkyRain
//---------------------------------------------------------------------------

/***************************************************************************\
 *
 *                        CSkyRainReg的属性和方法
 *
 * ┌──┬─────────┬─────────────────────┬─────────────────┬────────────────────┐
 * │项│  类入口 │                     │                 │                    │
 * │  │         │    名  称           │    参  数       │    说        明    │
 * │目│  指明符 │                     │                 │                    │
 * ├──┼─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │属│private  │Root                 │                 │指向根结点的指针    │
 * │性│         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │OpenKeyPtr           │                 │当前打开主键结点的指│
 * │  │         │                     │                 │针                  │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │PrisorKey            │                 │当前打主键的前驱指针│
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │ValueParent          │                 │当前打开键值结点的父│
 * │  │         │                     │                 │指针结点            │
 * │  ├─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │  │protected│FileName             │                 │保存数据信息的文件名│
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │pCopySurKey          │                 │指示复制的源主键    │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │pCopySurValue        │                 │指示复制的源键值结点│
 * │  ├─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │  │public   │CopyType             │                 │复制信息类型        │
 * ├──┼─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │方│private  │BiTreeEmpty          │无               │                    │
 * │法│         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │ReadKeyValue         │                 │                    │
 * │  │         │                     │                 │                    │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │                     │                 │                    │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │                     │                 │                    │
 * │  │         │                     │                 │                    │
 * │  ├─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │  │protected│                     │                 │                    │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │                     │                 │                    │
 * │  │         ├─────────────────────┼─────────────────┼────────────────────┤
 * │  │         │                     │                 │                    │
 * │  ├─────────┼─────────────────────┼─────────────────┼────────────────────┤
 * │  │public   │                     │                 │                    │
 * └──┴─────────┴─────────────────────┴─────────────────┴────────────────────┘
 *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -