VC++模拟HashTable

/*
作者:陈声涛
用途:用于存储大信息量多字段数据的存储,尤其用于网络上多字段数据的传输。传输双方只需要协定传输的数据的字段即可。
*/

 

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define MEMSIZE 4096
class HashTable

private:
 char * IntToString(int TheInt);  
 //Int类型的数据转换成字符串,便于网络传输
 int StringToInt(char * TheString);
 //字符串转换成Int类型的数据
 void StoreString(char *DestSTR,char * TheString);
 //将数据TheString存储到DestSTR最后
 
 //从完整的HashTable中获取第一组数据
 int GetLength(char * TheHashTable);
 char * GetValue(char * TheHashTable,int ValueLength,char *Value);
public:
 char * TheHashTable;
 HashTable();
 //将列名Column和值Value组添加到HashTable中
 void  Add(char * Column,char * Value);
 //从HashTable中获取列名为Column的值
 char * GetValue(char * Column);
};


HashTable::HashTable()
{
 TheHashTable=(char *)calloc(MEMSIZE,sizeof(char));
}

char * HashTable::IntToString(int TheInt)
{
 char * TheString=(char *)calloc(MEMSIZE,sizeof(char));
 sprintf(TheString,"%d",TheInt);
 return TheString;
}

int HashTable::StringToInt(char * TheString)
{
 int TheInt=atoi(TheString);
 return TheInt;
}

void HashTable::StoreString(char * DestSTR,char * TheString)
{
 int StringLength=strlen(TheString);
 memcpy(DestSTR+strlen(DestSTR),TheString,StringLength);
}
int HashTable::GetLength(char *TheHashTable)
{
 int i=1;
 char * ValueSTR=(char*)calloc(MEMSIZE,sizeof(char));
 while(TheHashTable[i]!=']')
 {
  ValueSTR[i-1]=TheHashTable[i];
  i++;
 }
 return StringToInt(ValueSTR);
}

char * HashTable::GetValue(char * TheHashTable,int ValueLength,char * Value)
{
 int i=1;
 char * ValueSTR=(char*)calloc(MEMSIZE,sizeof(char));
 memcpy(ValueSTR,TheHashTable+1+2+strlen(IntToString(ValueLength)),ValueLength);
 
 sprintf(Value,"%s",ValueSTR);
 return TheHashTable+ValueLength+2+2+strlen(IntToString(ValueLength));
}

void HashTable::Add(char * Column,char * Value)
{
 int ColumnLength=strlen(Column);
 int ValueLength=strlen(Value);
 
 //添加Column长度
 StoreString(TheHashTable,"[" );
 StoreString(TheHashTable, IntToString(ColumnLength));
 StoreString(TheHashTable, "]");
 
 //添加Column
 StoreString(TheHashTable,"[" );
 StoreString(TheHashTable, Column);
 StoreString(TheHashTable, "]");
 
 //添加Value长度
 StoreString(TheHashTable,"[" );
 StoreString(TheHashTable, IntToString(ValueLength));
 StoreString(TheHashTable, "]");
 
 //添加Value
 StoreString(TheHashTable,"[" );
 StoreString(TheHashTable, Value);
 StoreString(TheHashTable, "]");
}

char * HashTable::GetValue(char *Column)
{
 char * TheSTR=(char*)calloc(MEMSIZE,sizeof(char));
 sprintf(TheSTR,"%s",TheHashTable);
 
 char * Values=(char*)calloc(MEMSIZE,sizeof(char));
 int t=0;
 while(!isspace(TheSTR[0]))
 {
  t=GetLength(TheSTR);
  TheSTR=GetValue(TheSTR,t,Values);
  
  if(!memcmp(Values,Column,t))
  {
   t=GetLength(TheSTR);
   TheSTR=GetValue(TheSTR,t,Values);
   return Values;
  }
 }
 return "不存在";
}

//调用示例

void main()
{
 HashTable MyTable;
 
 MyTable.Add("version","2013-03-01");
 MyTable.Add("c1","aaa dfwerwe f");
 MyTable.Add("c2","456aa!@$#%$ dfwerwe f");
 MyTable.Add("c3","aa^&*))a erwe f");
 
 printf("HashTable结构示例 :%s\n\n\n",MyTable.TheHashTable);
 
 printf("表项version:%s\n",MyTable.GetValue("version"));
 printf("表项c1:%s\n",MyTable.GetValue("c1"));
 printf("表项c2:%s\n",MyTable.GetValue("c2"));
 printf("表项c3:%s\n",MyTable.GetValue("c3"));

 printf("表项c1:%s\n",MyTable.GetValue("c1"));
 printf("表项version:%s\n",MyTable.GetValue("version"));
}

posted @ 2013-03-04 20:57  陈声涛  阅读(396)  评论(0)    收藏  举报