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

📄 skyrainreg.h

📁 《数据结构》中二叉树的常用算法的练习。包括排序、兄弟-孩子链表的建立
💻 H
📖 第 1 页 / 共 3 页
字号:
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
//※                                                                         
//※  	文件名:SkyRainReg.h       	                                         
//※                                                                         
//※    天雨注册表数据结构 Visual C++2005 实现程序代码头文件                   
//※                                                                         
//※    版权所有:赵天雨 zxphxh@163.com  2003 - 2006                          
//※                                                                         
//※    Version:2.0.060215                                                  
//※                                                                         
//※    创建日期:2006.02.15                                                  
//※                                                                         
//※    最后修改日期:                                           
//※                                                                         
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

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

#pragma once
#pragma warning(disable : 4996)

#include <shlwapi.h>
#include <tchar.h>
#include <stdio.h>
//---------------------------------------------------------------------------

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

/****************************************************************************
*                                                                           
*                       数据结点格式说明                                     
*                                                                            
*       1.孩子--兄弟二叉链表表示树形结构(Windows的注册表结构)。              
*                                                                            
*		  例如:注册表结构为(■表示为主键 ●表示为键值)                        
*				A■──┐                                                        
*                   ■B─┬─■C──●c0                                            
*					│  ├─■D                                                  
*					│  ├─●b0                                                 
*					│  └─●b1                                                 
*					■F─┬─■G──┬─■H──┬─●h0                                    
*					   ├─●f0 └─●g0 ├─●h1                                 
*					   └─●f1       └─●h2                        		 
*                                                                           
*         用孩子--兄弟二叉链表表示为:(左指针为子主键 右指针为兄弟主键 水平   
*		  指针为主键的键值, 结点的左指针为孩子指针 SubKey 右指针为兄弟指针   
*		  SibKey)                                                 			 
*                         ■A                                                 
*						  /                                                  
*                        /                                                   
*						■B───●b0───●b1                                       
*					   / \                                                  
*					  /   \                                                 
*		       c0●───■C    ■F───●f0───●f1                                   
*			   	 	 \     /                                                
*				      \   /                                                 
*				      ■D ■G───●g0                                          
*						 /                                                   
*                       /                                                    
*					   ■H───●h0───●h1───●h2                                  
*                                                                           *
*       当前主键中的子主键,都在该主键的右子树中。同一层中的子主键结点,是  *
*                                                                           *
*	从小到大顺序排列。在孩子--兄弟二叉链表中从该主键结点沿其右子树一直到底  *
*                                                                           *
*	遍历,既是该主键的第一层中的所有子主键结点。第二层的子主键结点沿第一层  *
*                                                                           *
*	相应的子主键结点的左子树访问到的第一个结点及该第一个结点沿其右子树遍历  *
*                                                                           *
*	的所有结点,第三层子主键结点以此类推....。                              *
*                                                                           *
*       2.为了提高查找效率和增大存储密度,主键数据结构采用孩子(SubKey)-兄弟  *
*                                                                           *
*	(SibKey)二叉树结构,并符以双亲指针域Parent和指向键值链表的指针域Value,  *
*                                                                           *
*	另外附加一个指向记录该主键数据结点信息的指针Info, 一个记录该主键名称的  *
*                                                                           *
*	字符串Name, 一个记录在遍历二叉树时记录主键结点是否访问过的标志Visited。 *
*                                                                           *
*	主键结点的数据结构如下(箭头表示指针域,▲表示数据域):                     *
*                                                                           *
*	    ┌────────┬────────┬────────┬───────┬──────┬──────┬─────────┐        *
*		│    ↑   │    ←   │    →   │   ↓   │   ↓  │   ▲  │     ▲   │        *
*		│ Parent │ SubKey │ SibKey │ Value │ Info │ Name │ Visited │        *
*		│        │        │        │       │      │      │         │        *
*		└────────┴────────┴────────┴───────┴──────┴──────┴─────────┘        *
*                                                                           *
*	typedef struct CKeyNode                                                 *
*   {                                                                       *
*       string  Name;                                                       *
*		TVisitTag   Visited;                                                *
*		CKeyNode  * SubKey;                                                 *
*		CKeyNode  * SibKey;                                                 *
*		CKeyNode  * Parent;                                                 *
*		CValueNode * Value;                                                 *
*		CNodeInfo * Info;                                                   *
*   }                                                                       *
*                                                                           *
*       3.键值数据结构采用单向链表数据结构CValueNode,如下所示:            *
*                                                                           *
*		┌────────┬────────┬────────┬───────┐         						*
*		│    ▲   │    ▲   │    ↓   │   →   │           					    *
*		│  Data  │  Name  │  Info  │ Next  │          					    *
*		│        │        │        │       │           					    *
*		└────────┴────────┴────────┴───────┘                                *
*																			*
*	typedef struct CValueNode                                               *
*   {                                                                       *
*		void       *Data;                                                   *
*		string  Name;                                                       *
*		CNodeInfo  *Info;                                                   *
*		CValueNode  *Next;                                                  *
*   }                                                                       *
*                                                                           *
*   其中:Data为void类型的数据,通过转换可以存储任何类型的数据              *
*                                                                           *
*		  Name为键值的名称,字符串类型                                      *
*                                                                           *
*		  Info为记录指向键值结点的信息数据域CNodeInfo的指针                 *
*                                                                           *
*		  Next为指向该结点的兄弟结点CValueNode的指针                        *
*                                                                           *
*		4.记录(主键或键值)数据结点信息的CNodeInfo数据结构:                 *
*                                                                           *
*   	为了方便数据的读写操作,在进行读写操作时不管是主键结点还是键值结点,*
*                                                                           *
*	需要根据结点具体情况,对该结点的周围连接信息作一下记录,这样需要在读写  *
*                                                                           *
*	操作时定义一个用来记录结点基本信息的数据类型CNodeInfo,其具体实现如下: *
*                                                                           *
*		┌────────┬──────────┬────────────┬─────────────┬─────┬─────┬─────┐  *
*		│   ▲    │    ▲     │     ▲      │     ▲       │  ▲  │  ▲  │  ▲  │  *
*		│DataType│StringSize│DataTypeSize│DataTypeCount│cFlag│sFlag│vFlag│  *
*		│        │          │            │             │     │     │     │  *
*		└────────┴──────────┴────────────┴─────────────┴─────┴─────┴─────┘  *
*                                                                           *
*	typedef struct CNodeInfo                                                *
*   {                                                                       *
*       TADataType DataType;                                                *
*       int        StringSize;                                              *
*       int        DataTypeSize;                                            *
*       int        DataTypeCount;                                           *
*       WORD       cFlag;                                                   *
*       WORD       sFlag;                                                   *
*       WORD       vFlag;                                                   *
*   }                                                                       *
*                                                     						*
*	其中:DataType为结点所记录的数据的类型  TADataType                      *
*                                                                           *
*		  StringSize为记录结点(主键或键值)名称的字符串大小 int              *
*                                                                           *
*		  DataTypeSize为记录数据类型的位数,如sizeof(char) int               *
*                                                                           *
*         DataTypeCount为记录的数据的字节数,如sizeof(char)*DataCOunt为字符  *
*                                                                           *
*			       串长度 int                                               *
*                                                                           *
*		  cFlag为标志是否有孩子结点 0:无 1:有  WORD                         *
*                                                                           *
*		  sFlag为标志是否有兄弟结点 0:无 1:有  WORD                         *
*                                                                           *
*		  vFlag为当记录主键结点时标志是否有键值结点 0:无 1:有  WORD         *
*                                                                           *
*   	5.储结存储及读取方法                                                *
*                                                                           *
*		数据读写时依据二杈树的先序遍历的方法及链表的顺序遍历的方法,先主键  *
*                                                                           *
*	后键值链表,先结点信息后结点名,对键值链表中的结点则接着读写键值数据,  *
*                                                                           *
*   并直到该键值链表的末尾,具体实现方法如下所示的顺序:                    *
*                                                                           *
*		┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐       *
*		│ 第 │ 第 │ 第 │ 第 │ 第 │ 第 │ 第 │ 第 │    │ 第 │ 第 │    │       *
*		│ 一 │ 一 │ 一 │ 一 │ 一 │ 二 │ 二 │ 二 │    │ 二 │ 二 │    │       *
*		│ 个 │ 个 │ 个 │ 个 │ 个 │ 个 │ 个 │ 个 │  … │ 个 │ 个 │  … │       *
*       │ 主 │ 主 │ 键 │ 键 │ 键 │ 键 │ 键 │ 键 │    │ 主 │ 主 │    │       *
*       │ 键 │ 键 │ 值 │ 值 │ 值 │ 值 │ 值 │ 值 │  … │ 键 │ 键 │  … │       *
*       │ 信 │ 名 │ 结 │ 结 │ 结 │ 结 │ 结 │ 结 │    │ 信 │ 名 │    │       *
*       │ 息 │    │ 点 │ 点 │ 点 │ 点 │ 点 │ 点 │  … │ 息 │    │  … │       *
*       │    │    │ 信 │ 名 │ 数 │ 信 │ 名 │ 数 │    │    │    │    │       *
*       │    │    │ 息 │    │ 据 │ 息 │    │ 据 │    │    │    │    │       *
*		└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘       *
*                                                                           *
*		6.操作主要是对二叉树进行排序、查找、插入、删除、遍历,及单链表的    *
*                                                                           *
*   排序、查找、插入、删除等。                                              *
*                                                                           *
*   2003.12.15                                                              *
*                                                                           *
*   2006.02.15 开始修定                                                     *
*                                                                           *
****************************************************************************/
//---------------------------------------------------------------------------

#define  USING_CHAR

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

#ifdef   USING_CHAR
typedef  char   STRTYPE; 
typedef  char  *PSTRTYPE;
#else
#define  STRTYPE   WCHAR
#define  PSTRTYPE  WCHAR*
#endif
//---------------------------------------------------------------------------
typedef time_t  CDateTime;
//---------------------------------------------------------------------------

#define  MAX_KEY_SIZE 					32
#define  MAX_DATA_CHAR_SIZE 			128
//---------------------------------------------------------------------------
#ifdef   USING_CHAR

#define  MAIN_ROOT_KEY_NAME 			"天雨注册表"
#define  CREATENEWKEY 					"新建主键 #"
#define  CREATENEWVALUE 				"新建键值 #"

#else

#define  MAIN_ROOT_KEY_NAME 			L"天雨注册表"
#define  CREATENEWKEY 					L"新建主键 #"
#define  CREATENEWVALUE 				L"新建键值 #"

#endif
//---------------------------------------------------------------------------

enum CVisitTag {vtUNVISITED, vtVISITED};
/****************************************************************************
*                                                                           *
*   说明:访问标识                                                          *
*                                                                           *
*   vtUNVISITED : 没有访问过                                                *
*                                                                           *
*   vtVISITED   : 已访问过                                                  *
*                                                                           *
****************************************************************************/

enum CNodeType  {ntMainKey,ntKeyValue};
/***************************************************************************\
 *
 *  说明:数据结点类型
 *
 *  ntMainKey  : 主键结点
 *
 *	ntKeyValue : 键值结点
 *
\***************************************************************************/

enum CADataType {dtINT,dtBOOL,dtFLOAT,dtSTRING,dtDATETIME,dtBINARY,dtIMAGE};
/***************************************************************************\
 *
 *  说明:数据结点记录的实际的数据类型
 *
 *  dtINT	   : 整数类型 包括int、long、unsigned int、unsigned long
 *
 *  dtBOOL	   : 布尔类型 bool (0, 1, true, false)
 *
 *  dtFLOAT	   : 浮点数类型 包括float double
 *
 *  dtSTRING   : 字符串类型 包括char、string
 *
 *  dtDATETIME : 日期时间类型 TDateTime
 *
 *	dtBINARY   : 二进制类型
 *
 *  dtIMAGE	   : 保存各种二进制的数据类型 包括图片、文件、声音等
 *
\***************************************************************************/

enum CInsertActive{iaSameKey, iaSuccess};

⌨️ 快捷键说明

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