/// <summary>
/// 查找要的键值
/// </summary>
/// <param name="searchkey">[in] void *searchkey:这里是变量的地址。</param>
/// <returns>返回的是该变量地址所在的hash表中的位置,-1则在hash表中没有此key</returns>
int SearchHashItem(void *searchkey)
{
int addr = (int)searchkey % HASHTABLE_LEN;
int i = addr,j = addr;
if(hasharr[i].hashkeyaddr == searchkey)
{
return i;
}
else
{
while((i >= 0 && i < 8) || (j >= 0 && j < 8 ))
{
i++;
if(hasharr[i].hashkeyaddr != NULL && hasharr[i].hashkeyaddr == searchkey)
{
return i;
}
j--;
if(hasharr[j].hashkeyaddr != NULL && hasharr[j].hashkeyaddr == searchkey)
{
return j;
}
}
}
return -1;
}
/// <summary>
/// 插入一个hash值
/// </summary>
/// <param name="address">[in] void *searchkey:这里的变量的地址。</param>
/// <returns>返回的是插入的位置</returns>
int InsertHashItem(void *address)
{
int addr = (int)address % HASHTABLE_LEN;
int i = addr,j = addr;
if(hasharr[i].hashkeyaddr == NULL )
{
return addr;
}
else
{
while( (i >= 0 && i < 8) || (j >= 0 && j < 8) )
{
i = i + 1;
if(hasharr[i].hashkeyaddr == NULL)
{
return i;
}
j = j + 1;
if(hasharr[j].hashkeyaddr == NULL)
{
return j;
}
}
}
return -1;
}
/// <summary>
///创建一个空间用以接受变量的地址
/// </summary>
/// <param name="address">[in] void *address:树的根。</param>
/// <param name="filename">[in] char* filename:树的根。</param>
/// <param name="line">[in] int line:树的根。</param>
/// <returns>无返回值</returns>
void *lib_malloc(int size,char *filename, int fileline)
{
void *pAddr = malloc(size);
int i = InsertHashItem(pAddr);
if(i < 0)
{
printf("sorry,hashtable is full");
}
else
{
hasharr[i].hashkeyaddr = pAddr;
hasharr[i].fileline = fileline;
strcpy(hasharr[i].filename,filename);
//printf("malloc success!/n");
}
return pAddr;
}
/// <summary>
/// 释放空间
/// </summary>
/// <param name="searchkey">[in] void *searchkey:要删除的key。</param>
/// <returns>无返回值</returns>
void lib_free(void *pAddress)
{
int i = SearchHashItem(pAddress);
if(i > 0)
{
free(pAddress);
hasharr[i].hashkeyaddr = NULL;
hasharr[i].fileline = 0;
strcpy(hasharr[i].filename,"");
printf("/ndelete success!/n");
}
else
{
printf("not found this key!");
}
}
/// <summary>
/// 打印hash表中的地址,所在文件,行号信息
/// </summary>
/// <returns>无返回值</returns>
void Print()
{
for(int i = 0; i < HASHTABLE_LEN; i++)
{
if(hasharr[i].hashkeyaddr != NULL)
printf("/nThis address is %d /n This FILE is %s /n This LINE is %d/n",(int)hasharr[i].hashkeyaddr,hasharr[i].filename,hasharr[i].fileline);
}
}