十万火急!!!100分求HashTable源码

bugebear3 2005-07-19 04:46:27
具体要求:
1、冲突检测采用链地址法。
2、C语言编写
3、具有创建/销毁/插入/删除/查找等基本功能。
...全文
242 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojun789 2006-03-08
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
哦不小心用C写了一个, mempool , allocator , vector , deque , slist , list , hash_set , hash_map , multi_hash_set , multi_hash_map , regex 都有,咔咔.
johnzhaobing 2005-08-07
  • 打赏
  • 举报
回复
谁有c的哈西表阿 想学习一下
bugebear3 2005-08-07
  • 打赏
  • 举报
回复
现在基本已经搞定了.

由于要求是必须用C语言写,所以不可能使用C++中的TEMPLATE了.

在C语言里要实现通用性确实比较麻烦,要用到两个东东:

1.通用指针void *;
2.函数指针.
bugebear3 2005-08-07
  • 打赏
  • 举报
回复
由于是公司的代码,所以不能贴出来,呵呵.
Alan S1 2005-08-05
  • 打赏
  • 举报
回复
代码解析:

//hashtable.cpp

#include"hashtable.h"
HashTable::HashTable()
{
int i;
for(i=0;i<PRIME;i++)
{
hashT[i].empty =true;
hashT[i].Field_Name[0]='\0';
hashT[i].left = NULL;//必须初始化

hashT[i].right = NULL;//必须初始化
}



}

HashTable::~HashTable()
{
int i;
for(i=0;i<PRIME;i++)
{
deleteAll((hashT[i].left));
deleteAll((hashT[i].right));
}


}

struct HashT* HashTable::queryHashT(char * str)
{
int hash;
hash =hashpjw(str);
if(hashT[hash].empty==true)
{
return(NULL);
}
else
{
return ( findNode((&hashT[hash]),str));
}
}
void HashTable::addHashT(char * val)
{
struct HashT * ptr;
int hash;
hash=hashpjw(val);
printf("HashTable.addHashT():hash(%s)=%d\n",val, hash);
if(hashT[hash].empty==true)
{
hashT[hash].empty=false;
strcpy(hashT[hash].Field_Name,val);
hashT[hash].left =NULL;
hashT[hash].right= NULL;
return;
}
ptr =&hashT[hash];
insertNode(ptr,val);

}

void HashTable::printHashT()
{
int i;
for(i=0;i<PRIME;i++)
{
if(hashT[i].empty==false)
{
printf("--Hash Slot (%d)--\n",i);
printTree(&(hashT[i]),0);
printf("\n");
}
}
printf("\n");


}
int HashTable::hashpjw(char *s)
{

unsigned char * p;
unsigned h=0,g;
for(p=((unsigned char * )s); * p!='\0';p=p+1)
{
h=(h<<4)+(*p);
if(g=(h&0xf0000000))
{
h=h^(g>>24);
h=h^g;
}
}
return h%PRIME;
}

struct HashT * HashTable::findNode(struct HashT * link, char * val)
{
if(link==NULL)
{
return(NULL);
}
else if(strcmp(val,link->Field_Name)==0)
{
return(link);
}
else if(strcmp(val,link->Field_Name)>0)
{
return(findNode(link->right,val));
}
else
{
return(findNode(link->left,val));
}
}
void HashTable::insertNode (struct HashT * &link, char *val)
{
if(link==NULL)
{
link= new struct HashT;//ÉêÇëÄÚ´æ
link->empty =false;
strcpy(link->Field_Name, val);
link->left = NULL;
link->right = NULL;
}
else if (strcmp(val,link->Field_Name)==0)
{
printf("HashTable.insertNode():redundant identifier %s\n",val);

}
else if (strcmp(val,link->Field_Name)<0)
{
insertNode(link->left,val);
}
else
{
insertNode(link->right,val);
}


}
void HashTable::printTree(struct HashT * link, int level)
{
int i;
if(link!=NULL)
{
printTree(link->right,level+1);

for(i=0;i<level;i++)
{
printf("-");
}
printf("identifer=%s\n",link->Field_Name);

printTree(link->left,level+1);

}
}
void HashTable::deleteAll(struct HashT *& link)
{
if(link!=NULL)
{
deleteAll(link->left);
deleteAll(link->right);
printf("HashTable.deleteAll():freeing %s \n",link->Field_Name);
delete link;
link =NULL;
}
}


//hashtable.h

#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct HashT
{
bool empty;
char Field_Name[32];
struct HashT * left;
struct HashT * right;
};
#define PRIME 13
class HashTable
{
private:
struct HashT hashT[PRIME];

int hashpjw(char *s);

struct HashT * findNode(struct HashT * link, char * val);
void insertNode (struct HashT * &link, char *val);
void printTree(struct HashT * link, int level);
void deleteAll(struct HashT * &link);

public:


HashTable();
~HashTable();
struct HashT * queryHashT(char * str);
void addHashT(char * val);
void printHashT();

};


#include"hashtable.h"
int main()
{

char str[32];
HashTable ht;
char * FieldArray[2]={"CallingNO","CalledNO"};

ht.addHashT("CallingNO");
ht.addHashT("CalledNO");
ht.printHashT();

for (int i=0;i<2;i++)
{

strcpy(str,FieldArray[i]);

if((ht.queryHashT(str))!=NULL)
{
printf("found %s\n",str);
}
else
{
printf("did not find %s\n",str);
}
}

return 0 ;
}

Alan S1 2005-08-05
  • 打赏
  • 举报
回复
http://www.herozhan.com/info/673.htm


改一下变成C++版本
bugebear3 2005-08-05
  • 打赏
  • 举报
回复
忘了一点,这个HASHTABLE还要具有通用性,要求它能够适用于所有的数据类型.
jixingzhong 2005-08-05
  • 打赏
  • 举报
回复
忘了一点,这个HASHTABLE还要具有通用性,要求它能够适用于所有的数据类型.

---------------------------------------------------------------------


C 语言怎么可能呀


你就使用 C++ 的好了 可以用 泛形 ...

pcboyxhy 2005-07-21
  • 打赏
  • 举报
回复
果然是数据结构作业啊
容易的很
懒的写了
bugebear3 2005-07-21
  • 打赏
  • 举报
回复
好多钱,说个价噻.
kunp 2005-07-19
  • 打赏
  • 举报
回复
如果给钱,我可以给你一份,哈哈哈哈哈哈哈
bugebear3 2005-07-19
  • 打赏
  • 举报
回复
老大,什么意思嘛?
antijpn 2005-07-19
  • 打赏
  • 举报
回复
直接求代码,视同作业

转新手乐园

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧