KScriptSet.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:25k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. // 
  4. // File: KScriptEngine.cpp
  5. // Date: 2001-9-11 10:33:35
  6. // Code: Romandou
  7. // Desc: 脚本集合控制基类
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KScriptSet.h"
  12. //---------------------------------------------------------------------------
  13. // 函数: KScriptSet::KScriptSet
  14. // 功能:
  15. // 返回:
  16. //---------------------------------------------------------------------------
  17. KScriptSet::KScriptSet()
  18. {
  19. m_nKeyStyle = KEY_STRING;
  20. m_pRootList = NULL;
  21. m_pLestRecent = NULL;
  22. m_pMostRecent = NULL;
  23. }
  24. KScriptSet::KScriptSet(int Key_Style)
  25. {
  26. if (Key_Style == KEY_NUMBER || Key_Style == KEY_STRING)
  27. m_nKeyStyle = Key_Style;
  28. else 
  29. {
  30. m_nKeyStyle = KEY_STRING;
  31. printf("UnKnown ScriptSet KeyStyle:[%d]. So Set Key As Default KeyStyle KEY_STRING.n", Key_Style);
  32. }
  33. m_pRootList = NULL;
  34. m_pLestRecent = NULL;
  35. m_pMostRecent = NULL;
  36. }
  37. //---------------------------------------------------------------------------
  38. // 函数: KScriptSet::~KScriptSet
  39. // 功能:
  40. // 返回:
  41. //---------------------------------------------------------------------------
  42. KScriptSet::~KScriptSet()
  43. {
  44. TScript * pTScript = NULL;
  45. TScript * pDelTScript = NULL;
  46. pTScript = m_pLestRecent;
  47. while(pTScript)
  48. {
  49. pDelTScript =  pTScript;
  50. pTScript = pTScript->pMoreRecent;
  51. DeleteScript(pDelTScript->szKey);
  52. }
  53. }
  54. //---------------------------------------------------------------------------
  55. // 函数: KScriptSet::GetScript
  56. // 功能:
  57. // 参数: char * szKey     //该脚本的关键字
  58. // 参数: BOOL nNeedCreate //当未在链表中找到时是否需要直接新建
  59. // 参数: BOOL nNeedUpdateRecent //是否需要更新Recent表,重新排序
  60. // 返回: KScript * 
  61. //---------------------------------------------------------------------------
  62. KScript * KScriptSet::GetScript(char * szKey, BOOL nNeedCreate = 1, BOOL nNeedUpdateRecent = 1)
  63. {
  64. if (szKey == NULL ) return NULL;
  65. KScript * pScript = NULL;
  66. TScript * pTScript = NULL;
  67. TScript * pGetTScript = NULL;
  68. BOOL nResult = 0;
  69. if (m_nKeyStyle != KEY_STRING)
  70. {
  71. printf("The ScriptSet's Key Is Not a String. So Can Not Find A CorrRespond Script.n");
  72. return NULL;
  73. }
  74. if (m_pRootList == NULL) 
  75. {
  76. if ((pScript = CreateScript(szKey, GetInitStackSize(szKey))) == NULL) 
  77. return NULL;
  78. pGetTScript = new TScript;
  79. if (pGetTScript == NULL) 
  80. return NULL;
  81. // 初始化Recent表
  82. pGetTScript->pLessRecent = NULL;
  83. pGetTScript->pMoreRecent = NULL;
  84. pGetTScript->pLeftChild = NULL;
  85. pGetTScript->pRightChild = NULL;
  86. pGetTScript->pScript = pScript;
  87. pGetTScript->pParent = NULL;
  88. strcpy(pGetTScript->szKey, szKey);
  89. m_pRootList = pGetTScript;
  90. m_pLestRecent = pGetTScript;
  91. m_pMostRecent = pGetTScript;
  92. return pScript;
  93. }
  94. pTScript = BTSearch(m_pRootList, m_pRootList, szKey, &nResult);
  95. if (nResult == 0)
  96. {
  97. if (nNeedCreate)//当查找不到时,是否需要建立一个
  98. {
  99. KScript * pNewScript;
  100. if ( (pNewScript = CreateScript(szKey, GetInitStackSize(szKey)) ) == NULL )
  101. {
  102. printf("Can not Create Script Instance ,Mayby No Memorys.n");
  103. return NULL;
  104. }
  105. pGetTScript = BTInsert(pTScript, szKey);
  106. if (pGetTScript == NULL) return NULL;
  107. pGetTScript->pScript = pNewScript;
  108. }
  109. else 
  110. return NULL;//不需要建立的话,就返回空值
  111. }
  112. else
  113. pGetTScript = pTScript;
  114. if (nNeedUpdateRecent) //如果需要更新Recent表,则更新
  115. UpdateRecent(nResult, pGetTScript);
  116. return pGetTScript->pScript;
  117. }
  118. KScript * KScriptSet::GetScript(DWORD nKey, BOOL nNeedCreate = 1, BOOL nNeedUpdateRecent = 1)
  119. {
  120. KScript * pScript = NULL;
  121. TScript * pTScript = NULL;
  122. TScript * pGetTScript = NULL;
  123. BOOL nResult = 0;
  124. if (m_nKeyStyle != KEY_NUMBER)
  125. {
  126. printf("The ScriptSet's Key Is Not a Number. So Can Not Find A CorrRespond Script.n");
  127. return NULL;
  128. }
  129. if (m_pRootList == NULL) 
  130. {
  131. if ((pScript = CreateScript(nKey, GetInitStackSize(nKey))) == NULL) 
  132. return NULL;
  133. pGetTScript = new TScript;
  134. if (pGetTScript == NULL) 
  135. return NULL;
  136. // 初始化Recent表
  137. pGetTScript->pLessRecent = NULL;
  138. pGetTScript->pMoreRecent = NULL;
  139. pGetTScript->pLeftChild = NULL;
  140. pGetTScript->pRightChild = NULL;
  141. pGetTScript->pScript = pScript;
  142. pGetTScript->pParent = NULL;
  143. strcpy(pGetTScript->szKey, "");
  144. pGetTScript->nKey = nKey;
  145. m_pRootList = pGetTScript;
  146. m_pLestRecent = pGetTScript;
  147. m_pMostRecent = pGetTScript;
  148. return pScript;
  149. }
  150. pTScript = BTSearch(m_pRootList, m_pRootList, nKey, &nResult);
  151. if (nResult == 0)
  152. {
  153. if (nNeedCreate)//当查找不到时,是否需要建立一个
  154. {
  155. KScript * pNewScript;
  156. if ( (pNewScript = CreateScript(nKey, GetInitStackSize(nKey)) ) == NULL )
  157. {
  158. printf("Can not Create Script Instance ,Mayby No Memorys.n");
  159. return NULL;
  160. }
  161. pGetTScript = BTInsert(pTScript, nKey);
  162. if (pGetTScript == NULL) return NULL;
  163. pGetTScript->pScript = pNewScript;
  164. }
  165. else 
  166. return NULL;//不需要建立的话,就返回空值
  167. }
  168. else
  169. pGetTScript = pTScript;
  170. if (nNeedUpdateRecent) //如果需要更新Recent表,则更新
  171. UpdateRecent(nResult, pGetTScript);
  172. return pGetTScript->pScript;
  173. }
  174. //---------------------------------------------------------------------------
  175. // 函数: KScriptSet::UpdateRecent
  176. // 功能: 更新Recent表
  177. // 参数: BOOL bExistedScirpt  是否pGetTScript是个早已存在的脚本对象
  178. // 参数: TScript pGetTScript  最新使用的脚本对象
  179. // 返回: void 
  180. //---------------------------------------------------------------------------
  181. void KScriptSet::UpdateRecent(BOOL bExistedScript, TScript *pGetTScript)
  182. {
  183. BOOL nResult  = bExistedScript;
  184. if (nResult == 0)//新生成的脚本
  185. {
  186. if (m_pRootList == NULL)//第一个结点
  187. {
  188. pGetTScript->pLessRecent = NULL;
  189. pGetTScript->pMoreRecent = NULL;
  190. m_pMostRecent = pGetTScript;
  191. m_pLestRecent = pGetTScript;
  192. }
  193. else
  194. {
  195. pGetTScript->pLessRecent = m_pMostRecent;
  196. pGetTScript->pMoreRecent = NULL;
  197. m_pMostRecent->pMoreRecent = pGetTScript;
  198. }
  199. }
  200. else //使用的是已存在的脚本
  201. {
  202. if (pGetTScript->pLessRecent == NULL && pGetTScript->pMoreRecent == NULL)
  203. {
  204. return ;
  205. }
  206. if (pGetTScript == m_pLestRecent)//该结点在链表的末尾
  207. {
  208. if (pGetTScript->pMoreRecent)//是否不只一个结点
  209. {
  210. m_pLestRecent = pGetTScript->pMoreRecent;//设置m_pLestRecent
  211. m_pLestRecent->pLessRecent = NULL;
  212. pGetTScript->pMoreRecent = NULL;
  213. pGetTScript->pLessRecent = m_pMostRecent;
  214. m_pMostRecent->pMoreRecent = pGetTScript;
  215. }
  216. }
  217. else if (pGetTScript == m_pMostRecent)//在头结点上
  218. {
  219. }
  220. else
  221. {
  222. pGetTScript->pMoreRecent->pLessRecent = pGetTScript->pLessRecent;
  223. pGetTScript->pLessRecent->pMoreRecent = pGetTScript->pMoreRecent;
  224. pGetTScript->pLessRecent = m_pMostRecent;
  225. pGetTScript->pMoreRecent = NULL;
  226. m_pMostRecent->pMoreRecent = pGetTScript;
  227. }
  228. }
  229. m_pMostRecent = pGetTScript;//设置m_pMostRecent
  230. }
  231. //---------------------------------------------------------------------------
  232. // 函数: KScriptSet::SearchScript
  233. // 功能:
  234. // 参数: char * szKey
  235. // 返回: BOOL 
  236. //---------------------------------------------------------------------------
  237. TScript *  KScriptSet::SearchScript(char * szKey, BOOL * pnResult)
  238. {
  239. TScript * pTScript;
  240. if (m_pRootList == NULL)
  241. return NULL;
  242. pTScript = BTSearch(m_pRootList, m_pRootList, szKey, pnResult  );
  243. return pTScript;
  244. }
  245. //---------------------------------------------------------------------------
  246. // 函数:  KScriptSet::SearchScript
  247. // 功能:
  248. // 参数: DWORD nKey
  249. // 参数: BOOL * pnResult
  250. // 返回: TScript * 
  251. //---------------------------------------------------------------------------
  252. TScript *  KScriptSet::SearchScript(DWORD nKey, BOOL * pnResult)
  253. {
  254. TScript * pTScript;
  255. if (m_pRootList == NULL)
  256. return NULL;
  257. pTScript = BTSearch(m_pRootList, m_pRootList, nKey, pnResult);
  258. return pTScript;
  259. }
  260. //---------------------------------------------------------------------------
  261. // 函数:  KScriptSet::CreateScript
  262. // 功能: 新建脚本实例,为虚函数,由派生类负责建立
  263. // 参数: char * szKey
  264. // 参数: int StackSize
  265. // 返回: KScript * 
  266. //---------------------------------------------------------------------------
  267. KScript *  KScriptSet::CreateScript(char * szKey , int StackSize)
  268. {
  269. return NULL;
  270. }
  271. //---------------------------------------------------------------------------
  272. // 函数:  KScriptSet::CreateScript
  273. // 功能:
  274. // 参数: DWORD nKey
  275. // 参数: int StackSize
  276. // 返回: KScript * 
  277. //---------------------------------------------------------------------------
  278. KScript *  KScriptSet::CreateScript(DWORD nKey , int StackSize)
  279. {
  280. return NULL;
  281. }
  282. //---------------------------------------------------------------------------
  283. // 函数: KScriptSet::DeleteScript
  284. // 功能:
  285. // 参数: char * szKey
  286. // 返回: BOOL 
  287. //---------------------------------------------------------------------------
  288. BOOL KScriptSet::DeleteScript(char * szKey)
  289. {
  290. BOOL nResult = FALSE;//查找的结果
  291. TScript * pTScript;//查找返回的指针
  292. pTScript = SearchScript(szKey, &nResult);
  293. if (nResult && pTScript) //在链表中找到了该关键字
  294. {
  295. if (pTScript->pScript)
  296. pTScript->pScript->Exit();
  297. if (pTScript->pLessRecent == NULL  && pTScript->pMoreRecent == NULL)//全部为空,即只有一个结点
  298. {
  299. m_pMostRecent = NULL;
  300. m_pLestRecent = NULL;
  301. //if (m_pRootList == pTScript) 
  302. // m_pRootList = NULL;
  303. return DeleteScript(pTScript);
  304. }
  305. else if (!(pTScript->pLessRecent && pTScript->pMoreRecent))//有一个为空
  306. {
  307. if (pTScript->pLessRecent)
  308. {
  309. pTScript->pLessRecent->pMoreRecent = NULL;
  310. if (m_pMostRecent == pTScript)
  311. m_pMostRecent = pTScript->pLessRecent;
  312. }
  313. else
  314. {
  315. pTScript->pMoreRecent->pLessRecent = NULL;
  316. if (m_pLestRecent == pTScript)
  317. m_pLestRecent = pTScript->pMoreRecent;
  318. }
  319. return DeleteScript(pTScript);
  320. }
  321. else//全实
  322. {
  323. pTScript->pLessRecent->pMoreRecent = pTScript->pMoreRecent;
  324. pTScript->pMoreRecent->pLessRecent = pTScript->pLessRecent;
  325. if (m_pMostRecent == pTScript)
  326. m_pMostRecent = pTScript->pLessRecent;
  327. if (m_pLestRecent == pTScript)
  328. m_pLestRecent = pTScript->pMoreRecent;
  329. return DeleteScript(pTScript);
  330. }
  331. }
  332. else
  333. return FALSE;
  334. return TRUE;
  335. }
  336. //---------------------------------------------------------------------------
  337. // 函数: KScriptSet::DeleteScript
  338. // 功能:
  339. // 参数: DWORD nKey
  340. // 返回: BOOL 
  341. //---------------------------------------------------------------------------
  342. BOOL KScriptSet::DeleteScript(DWORD nKey)
  343. {
  344. BOOL nResult = FALSE;//查找的结果
  345. TScript * pTScript;//查找返回的指针
  346. pTScript = SearchScript(nKey, &nResult);
  347. if (nResult && pTScript) //在链表中找到了该关键字
  348. {
  349. if (pTScript->pScript)
  350. pTScript->pScript->Exit();
  351. if (pTScript->pLessRecent == NULL  && pTScript->pMoreRecent == NULL)//全部为空,即只有一个结点
  352. {
  353. m_pMostRecent = NULL;
  354. m_pLestRecent = NULL;
  355. return DeleteScript(pTScript);
  356. }
  357. else if (!(pTScript->pLessRecent && pTScript->pMoreRecent))//有一个为空
  358. {
  359. if (pTScript->pLessRecent)
  360. {
  361. pTScript->pLessRecent->pMoreRecent = NULL;
  362. if (m_pMostRecent == pTScript)
  363. m_pMostRecent = pTScript->pLessRecent;
  364. }
  365. else
  366. {
  367. pTScript->pMoreRecent->pLessRecent = NULL;
  368. if (m_pLestRecent == pTScript)
  369. m_pLestRecent = pTScript->pMoreRecent;
  370. }
  371. return DeleteScript(pTScript);
  372. }
  373. else//全实
  374. {
  375. pTScript->pLessRecent->pMoreRecent = pTScript->pMoreRecent;
  376. pTScript->pMoreRecent->pLessRecent = pTScript->pLessRecent;
  377. if (m_pMostRecent == pTScript)
  378. m_pMostRecent = pTScript->pLessRecent;
  379. if (m_pLestRecent == pTScript)
  380. m_pLestRecent = pTScript->pMoreRecent;
  381. return DeleteScript(pTScript);
  382. }
  383. }
  384. else
  385. return FALSE;
  386. return TRUE;
  387. }
  388. //---------------------------------------------------------------------------
  389. // 函数: KScriptSet::DeleteScript
  390. // 功能:
  391. // 参数: TScript * pTScript
  392. // 返回: BOOL 
  393. //---------------------------------------------------------------------------
  394. BOOL KScriptSet::DeleteScript(TScript * pTScript)
  395. {
  396. if (pTScript == NULL)
  397. return FALSE;
  398. TScript * pDelTScript;
  399. pDelTScript = BTDelete(pTScript, &m_pRootList, m_nKeyStyle);
  400. return TRUE;
  401. }
  402. //---------------------------------------------------------------------------
  403. // 函数: KScriptSet::InsertScript
  404. // 功能:
  405. // 参数: char * szKey
  406. // 参数: KScript * pScript
  407. // 返回: BOOL 
  408. //---------------------------------------------------------------------------
  409. TScript*  KScriptSet::InsertScript(char * szKey)
  410. {
  411. BOOL nResult = 0;
  412. TScript * pTScript = NULL;
  413. //TScript * pNewTScript = NULL;
  414. pTScript = BTSearch(m_pRootList, m_pRootList, szKey, &nResult);
  415. if (nResult == 1)
  416. {
  417. printf("Have Exist This Key In TScript Setsn");
  418. return NULL;
  419. }
  420. else if (nResult == 0)
  421. return BTInsert(pTScript, szKey);
  422. else return NULL;
  423. }
  424. //---------------------------------------------------------------------------
  425. // 函数: KScriptSet::InsertScript
  426. // 功能:
  427. // 参数: DWORD nKey
  428. // 返回: TScript*  
  429. //---------------------------------------------------------------------------
  430. TScript*  KScriptSet::InsertScript(DWORD nKey)
  431. {
  432. BOOL nResult = 0;
  433. TScript * pTScript = NULL;
  434. //TScript * pNewTScript = NULL;
  435. pTScript = BTSearch(m_pRootList, m_pRootList, nKey, &nResult);
  436. if (nResult == 1)
  437. {
  438. printf("Have Exist This Key In TScript Setsn");
  439. return NULL;
  440. }
  441. else if (nResult == 0)
  442. return BTInsert(pTScript, nKey);
  443. else return NULL;
  444. }
  445. //---------------------------------------------------------------------------
  446. // 函数: KScriptSet::GetScriptStackSize
  447. // 功能:
  448. // 参数: char * szKey
  449. // 返回: int 
  450. //---------------------------------------------------------------------------
  451. int KScriptSet::GetInitStackSize(char * szKey)
  452. {
  453. return 0;
  454. }
  455. //---------------------------------------------------------------------------
  456. // 函数: KScriptSet::GetScriptStackSize
  457. // 功能:
  458. // 参数: DWORD nKey
  459. // 返回: int 
  460. //---------------------------------------------------------------------------
  461. int KScriptSet::GetInitStackSize(DWORD nKey)
  462. {
  463. return 0;
  464. }
  465. //---------------------------------------------------------------------------
  466. // 函数: KScriptSet::ListScriptsKey
  467. // 功能:
  468. // 返回: void 
  469. //---------------------------------------------------------------------------
  470. DWORD  KScriptSet::ListScriptsKey()
  471. {
  472. return BTPreorder(m_pRootList);
  473. }
  474. DWORD  KScriptSet::ListRecent(int order = 0)
  475. {
  476. TScript * pTScript;
  477. DWORD nCount = 0;
  478. if (order == 0)
  479. {
  480. pTScript = m_pMostRecent;
  481. while(pTScript)
  482. {
  483. // printf("%sn",pTScript->szKey);
  484. pTScript = pTScript->pLessRecent;
  485. nCount ++;
  486. }
  487. return nCount;
  488. }
  489. else
  490. {
  491. pTScript = m_pLestRecent;
  492. while(pTScript)
  493. {
  494. // printf("%sn",pTScript->szKey);
  495. pTScript = pTScript->pMoreRecent;
  496. nCount ++;
  497. }
  498. return nCount;
  499. }
  500. }
  501. BOOL KScriptSet::Run(char * szKey)
  502. {
  503. return TRUE;
  504. }
  505. BOOL KScriptSet::Run(DWORD nKey)
  506. {
  507. return TRUE;
  508. }
  509. BOOL KScriptSet::RunFunction(char * szKey, char * szFuncName, char * szFormat, ...)
  510. {
  511. return TRUE;
  512. }
  513. BOOL KScriptSet::RunFunction(DWORD nKey, char * szFuncName, char * szFormat, ...)
  514. {
  515. return TRUE;
  516. }
  517. //---------------------------------------------------------------------------
  518. // 函数: BTSearch
  519. // 功能: 查找是否存在指定的关键字的二叉树结点,如果存在则*pResult = 1,返回相应指针;
  520. // 否则的话*pResult = 0,返回最接近的指针(该指针对今后插入有用)
  521. // 参数: TScript * pParentTScript 为递归调用传入父结点
  522. // 参数: TScript * pTScript
  523. // 参数: char * szKey 关键点
  524. // 参数: BOOL * pResult 指向是否找到该结点的标志
  525. // 返回: TScript * 
  526. //---------------------------------------------------------------------------
  527. TScript * BTSearch(TScript * pParentTScript, TScript * pTScript, char * szKey, BOOL * pResult)
  528. {
  529. if (pTScript == NULL || pParentTScript == NULL)
  530. {
  531. *pResult = FALSE;
  532. return pParentTScript;
  533. }
  534. int nResult = strcmp(szKey, pTScript->szKey);
  535. if (nResult == 0)
  536. {
  537. *pResult = TRUE;
  538. return pTScript;
  539. }
  540. else if (nResult > 0)
  541. return BTSearch(pTScript, pTScript->pRightChild, szKey, pResult);
  542. else
  543. return BTSearch(pTScript, pTScript->pLeftChild, szKey, pResult);
  544. }
  545. //---------------------------------------------------------------------------
  546. // 函数: BTSearch
  547. // 功能:
  548. // 参数: TScript * pParentTScript
  549. // 参数: TScript * pTScript
  550. // 参数: DWORD nKey
  551. // 参数: BOOL * pResult
  552. // 返回: TScript * 
  553. //---------------------------------------------------------------------------
  554. TScript * BTSearch(TScript * pParentTScript, TScript * pTScript, DWORD nKey, BOOL * pResult)
  555. {
  556. if (pTScript == NULL || pParentTScript == NULL)
  557. {
  558. *pResult = FALSE;
  559. return pParentTScript;
  560. }
  561. if (nKey == pTScript->nKey)
  562. {
  563. *pResult = TRUE;
  564. return pTScript;
  565. }
  566. else if (nKey > pTScript->nKey)
  567. return BTSearch(pTScript, pTScript->pRightChild, nKey, pResult);
  568. else
  569. return BTSearch(pTScript, pTScript->pLeftChild, nKey, pResult);
  570. }
  571. //---------------------------------------------------------------------------
  572. // 函数: BTInsert
  573. // 功能: 以pTScrpt为父,插入以szKey为关键点的结点
  574. // 参数: TScript *pTScript 
  575. // 参数: char * szKey
  576. // 返回: TScript * 返回插入的结点
  577. //---------------------------------------------------------------------------
  578. TScript * BTInsert(TScript *pTScript, char * szKey)
  579. {
  580. TScript * pNewTScript = new TScript;
  581. int nResult = 0;
  582. if (pNewTScript == NULL)
  583. return NULL;
  584. pNewTScript->pLeftChild = NULL;
  585. pNewTScript->pParent = NULL;
  586. pNewTScript->pRightChild = NULL;
  587. strcpy(pNewTScript->szKey,szKey);
  588. nResult = strcmp(szKey, pTScript->szKey);
  589. if (nResult == 0)
  590. return NULL;
  591. //根据大小确定左子还是右子
  592. if (nResult > 0)
  593. {
  594. pTScript->pRightChild = pNewTScript;
  595. pNewTScript->pParent = pTScript;
  596. }
  597. else 
  598. {
  599. pTScript->pLeftChild = pNewTScript;
  600. pNewTScript->pParent = pTScript;
  601. }
  602. return pNewTScript;
  603. }
  604. //---------------------------------------------------------------------------
  605. // 函数: BTInsert
  606. // 功能:
  607. // 参数: TScript *pTScript
  608. // 参数: DWORD nKey
  609. // 返回: TScript * 
  610. //---------------------------------------------------------------------------
  611. TScript * BTInsert(TScript *pTScript, DWORD nKey)
  612. {
  613. TScript * pNewTScript = new TScript;
  614. int nResult = 0;
  615. if (pNewTScript == NULL)
  616. return NULL;
  617. pNewTScript->pLeftChild = NULL;
  618. pNewTScript->pParent = NULL;
  619. pNewTScript->pRightChild = NULL;
  620. pNewTScript->nKey = nKey;
  621. if (nKey == pTScript->nKey)
  622. return NULL;
  623. //根据大小确定左子还是右子
  624. if (nKey > pTScript->nKey)
  625. {
  626. pTScript->pRightChild = pNewTScript;
  627. pNewTScript->pParent = pTScript;
  628. }
  629. else 
  630. {
  631. pTScript->pLeftChild = pNewTScript;
  632. pNewTScript->pParent = pTScript;
  633. }
  634. return pNewTScript;
  635. }
  636. //---------------------------------------------------------------------------
  637. // 函数:  BTDelete
  638. // 功能: 删除结点
  639. // 参数: TScript * pTScript
  640. // 参数: TScript ** ppRootTScript
  641. // 返回: TScript * 
  642. //---------------------------------------------------------------------------
  643. TScript *  BTDelete(TScript * pTScript, TScript ** ppRootTScript, int nKeyStyle)
  644. {
  645. TScript * pFindTScript;
  646. if (pTScript == NULL)
  647. return NULL;
  648. if (pTScript->pLeftChild == NULL && pTScript->pRightChild == NULL)//该结点没有左右子
  649. {
  650. if (*ppRootTScript == pTScript)
  651. {
  652. *ppRootTScript = NULL;
  653. }
  654. else
  655. {
  656. int nResult ;
  657. if (nKeyStyle == KEY_STRING)
  658. {
  659. nResult = strcmp(pTScript->szKey, pTScript->pParent->szKey);
  660. }
  661. else
  662. {
  663. if (pTScript->nKey < pTScript->pParent->nKey)
  664. nResult = -1;
  665. else
  666. nResult = 1;
  667. }
  668. if (nResult < 0)//小于
  669. pTScript->pParent->pLeftChild = NULL;
  670. else
  671. pTScript->pParent->pRightChild = NULL;
  672. }
  673. delete pTScript;
  674. return NULL;
  675. }
  676. else if (!(pTScript->pLeftChild && pTScript->pRightChild))//只有单子时
  677. {
  678. if (pTScript == *ppRootTScript)
  679. {
  680. if (pTScript->pLeftChild)
  681. {
  682. *ppRootTScript = pTScript->pLeftChild;
  683. pTScript->pLeftChild->pParent = NULL;
  684. }
  685. else
  686. {
  687. *ppRootTScript = pTScript->pRightChild;
  688. pTScript->pRightChild->pParent = NULL;
  689. }
  690. delete pTScript;
  691. return NULL;
  692. }
  693. int nResult ;
  694. if (nKeyStyle == KEY_STRING)
  695. {
  696. nResult = strcmp(pTScript->szKey, pTScript->pParent->szKey);
  697. }
  698. else
  699. {
  700. if (pTScript->nKey < pTScript->pParent->nKey)
  701. nResult = -1;
  702. else
  703. nResult = 1;
  704. }
  705. if (nResult < 0)//在父的左边
  706. {
  707. if (pTScript->pLeftChild)//只有左子
  708. {
  709. pTScript->pParent->pLeftChild = pTScript->pLeftChild;
  710. pTScript->pLeftChild->pParent = pTScript->pParent;
  711. }
  712. else
  713. {
  714. pTScript->pParent->pLeftChild = pTScript->pRightChild;
  715. pTScript->pRightChild->pParent = pTScript->pParent;
  716. }
  717. delete pTScript;
  718. }
  719. else 
  720. {
  721. if (pTScript->pLeftChild)//只有左子
  722. {
  723. pTScript->pParent->pRightChild = pTScript->pLeftChild;
  724. pTScript->pLeftChild->pParent = pTScript->pParent;
  725. }
  726. else
  727. {
  728. pTScript->pParent->pRightChild = pTScript->pRightChild;
  729. pTScript->pRightChild->pParent = pTScript->pParent;
  730. }
  731. delete pTScript;
  732. return NULL;
  733. }  
  734. else//有全子 
  735. {
  736. //if (strcmp(pTScript, pTScript->pParent) < 0)//在父的左面
  737. {
  738. pFindTScript = BTFindLess(pTScript->pLeftChild);
  739. if (pFindTScript)
  740. {
  741. //第一部分:处理该结点有左子时,对左子进行指向的改变
  742. //该结点仍有左子
  743. if (pFindTScript->pLeftChild)
  744. {
  745. //当发现所将要替代的结点正是它的左子时,将原来的关系不将变化;否则按正常思路改变
  746. if (pFindTScript != pTScript->pLeftChild)
  747. {
  748. pFindTScript->pParent->pRightChild = pFindTScript->pLeftChild;
  749. pFindTScript->pLeftChild->pParent = pFindTScript->pParent;
  750. }
  751. }
  752. else
  753. {
  754. if (pFindTScript != pTScript->pLeftChild)
  755. {
  756. pFindTScript->pParent->pRightChild = NULL;
  757. }
  758. }
  759. //第二部分:改变替换结点链结,实现与原结点相同。
  760. //处理当该替换的结点为删除结点的左子的特殊情况
  761. if (pFindTScript == pTScript->pLeftChild)
  762. {
  763. //其左子不用交代,保持原状
  764. pTScript->pRightChild->pParent = pFindTScript;
  765. //其左子不用交代,保持原状
  766. pFindTScript->pRightChild = pTScript->pRightChild;
  767. pFindTScript->pParent = pTScript->pParent;
  768. }
  769. else
  770. {
  771. pTScript->pLeftChild->pParent = pFindTScript;
  772. pTScript->pRightChild->pParent = pFindTScript;
  773. pFindTScript->pLeftChild = pTScript->pLeftChild ; 
  774. pFindTScript->pRightChild = pTScript->pRightChild;
  775. pFindTScript->pParent = pTScript->pParent;
  776. }
  777. //第三部分   删除结点之父结点链结
  778. if (*ppRootTScript == pTScript)
  779. {
  780. *ppRootTScript = pFindTScript;
  781. pFindTScript->pParent = NULL;
  782. }
  783. else 
  784. {
  785. int nResult ;
  786. if (nKeyStyle == KEY_STRING)
  787. {
  788. nResult = strcmp(pTScript->szKey, pTScript->pParent->szKey);
  789. }
  790. else
  791. {
  792. if (pTScript->nKey, pTScript->pParent->nKey)
  793. nResult = -1;
  794. else
  795. nResult = 1;
  796. }
  797. if (nResult < 0)//在父的左面
  798. {
  799. pTScript->pParent->pLeftChild = pFindTScript;
  800. }
  801. else
  802. {
  803. pTScript->pParent->pRightChild = pFindTScript;
  804. }
  805. }
  806. delete pTScript;
  807. return pFindTScript;
  808. }
  809. else
  810. return NULL;
  811. }
  812. }
  813. }
  814. //---------------------------------------------------------------------------
  815. // 函数: BTFindLess
  816. // 功能:
  817. // 参数: TScript * pTScript
  818. // 返回: TScript * 
  819. //---------------------------------------------------------------------------
  820. TScript * BTFindLess(TScript * pTScript)
  821. {
  822. if (pTScript == NULL)
  823. return NULL;
  824. if (pTScript->pRightChild == NULL )
  825. return pTScript;
  826. else
  827. return BTFindLess(pTScript->pRightChild);
  828. }
  829. //---------------------------------------------------------------------------
  830. // 函数: BTPreorder
  831. // 功能:
  832. // 参数: TScript * pTScript
  833. // 返回: DWORD  
  834. //---------------------------------------------------------------------------
  835. DWORD  BTPreorder(TScript * pTScript)//中序遍历
  836. {
  837. static DWORD nCount = 0;
  838. if (pTScript != NULL)
  839. {
  840. BTPreorder(pTScript->pLeftChild);
  841. //printf("nKey [%d%sn", pTScript->szKey);
  842. nCount ++;
  843. BTPreorder(pTScript->pRightChild);
  844. }
  845. return nCount;
  846. }