Hash.cpp
上传用户:oldpeter23
上传日期:2013-01-09
资源大小:1111k
文件大小:4k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. //NetTalk
  2. /*------------------------------------------------------------------------------*
  3.  =============================
  4.    模块名称: Hash.cpp
  5.  =============================
  6.  
  7.  [版权]
  8.  
  9.    2000-2002  115软件工厂  版权所有
  10.                                               
  11. *------------------------------------------------------------------------------*/
  12. #include "Hash.h"
  13. /*------------------------------------------------------------------------------*/
  14. CHash::CHash(int iSlots) 
  15. {
  16. //初始化默认5个入口
  17.     if (iSlots < 5) iSlots = 5;
  18.     m_pHashSlots = new CHashElem*[iSlots];
  19. for(int i=0;i<iSlots;i++)
  20. m_pHashSlots[i]=0;
  21.     m_iNumSlots = iSlots;
  22. m_iLength=0;
  23. }
  24. /*------------------------------------------------------------------------------*/
  25. CHash::~CHash() 
  26. {
  27.     if (m_pHashSlots)
  28. {
  29. CHashElem *phe;
  30. for (int i=0;i<m_iNumSlots;i++) 
  31. {
  32. phe = m_pHashSlots[i];
  33. while (phe != 0) 
  34. {
  35. CHashElem *pNext = phe->pNext;
  36. delete phe;
  37. phe = pNext;
  38. }
  39. }
  40. delete m_pHashSlots;
  41. m_pHashSlots = 0;
  42.     }
  43. }
  44. /*------------------------------------------------------------------------------*/
  45. bool CHash::QueryValue(const int Key,int& Val) 
  46. {
  47. bool bRet=false;
  48.     unsigned int num=(unsigned int)Key%m_iNumSlots;
  49. if (num >= 0)
  50. {
  51. CHashElem *pElem = m_pHashSlots[num];
  52. while (pElem) 
  53. {
  54. if (pElem->Key==Key) 
  55. {
  56. Val=pElem->Val;
  57. bRet=true;
  58. }
  59. pElem = pElem->pNext;
  60. }
  61.     }
  62. return bRet;
  63.     
  64. }
  65. /*------------------------------------------------------------------------------*/
  66. CHashElem*  CHash::QueryElem(const int iIndex)
  67. {
  68. CHashElem *pElem=0;
  69. int iSlot=0;
  70. pElem=m_pHashSlots[0];
  71. for(int i=0;i<=iIndex;i++)
  72. {
  73. BEGIN:
  74. if(iSlot<m_iNumSlots)
  75. {
  76. if(!pElem)
  77. {
  78. iSlot++;
  79. pElem=m_pHashSlots[iSlot];
  80. goto BEGIN;
  81. }
  82. else
  83. {
  84. pElem=pElem->pNext;
  85. }
  86. }
  87. else
  88. {
  89. pElem=0;
  90. break;
  91. }
  92. }
  93. return pElem;
  94. }
  95. /*------------------------------------------------------------------------------*/
  96. bool CHash::Insert(int Key, int Val) 
  97. {
  98. bool bRet=false;
  99.     unsigned int num=(unsigned int)Key%m_iNumSlots;
  100.     if (num >= 0)
  101. {
  102. if (m_pHashSlots[num]) 
  103. {
  104. CHashElem *pIns = m_pHashSlots[num];
  105. while (pIns->pNext) 
  106. {
  107. pIns = pIns->pNext;
  108. }
  109. pIns->pNext = new CHashElem;
  110. pIns->pNext->pNext = 0;
  111. pIns->pNext->Val = Val;
  112. pIns->pNext->Key = Key;
  113. bRet=true;
  114. m_iLength++;
  115. else 
  116. {
  117. m_pHashSlots[num] = new CHashElem;
  118. m_pHashSlots[num]->pNext = 0;
  119. m_pHashSlots[num]->Key = Key;
  120. m_pHashSlots[num]->Val = Val;
  121. bRet=true;
  122. m_iLength++;
  123. }
  124.     }
  125. return bRet;
  126. }
  127. /*------------------------------------------------------------------------------*/
  128. bool CHash::Remove(const int Key) 
  129. {
  130. bool bRet=false;
  131.     unsigned int num=(unsigned int)Key%m_iNumSlots;
  132.     if (num >= 0) 
  133. {
  134. CHashElem *pElem = m_pHashSlots[num];
  135. CHashElem *pPrev = 0;
  136. while (pElem) 
  137. {
  138. if (pElem->Key==Key) 
  139. {
  140. if (pPrev) 
  141. {
  142. pPrev->pNext = pElem->pNext;
  143. }
  144. else 
  145. {
  146. m_pHashSlots[num] = pElem->pNext;
  147. }
  148. delete pElem;
  149. bRet=true;
  150. m_iLength--;
  151. break;
  152. }
  153. pPrev = pElem;
  154. pElem = pElem->pNext;
  155. }
  156.     }
  157. return bRet;
  158. }
  159. /*------------------------------------------------------------------------------*/
  160. int CHash::GetLength()
  161. {
  162. return m_iLength;
  163. }
  164. /*------------------------------------------------------------------------------*/
  165. int CHash::GetSlotNum()
  166. {
  167. return m_iNumSlots;
  168. }
  169.