社区
新手乐园
帖子详情
十万火急!!!100分求HashTable源码
bugebear3
2005-07-19 04:46:27
具体要求:
1、冲突检测采用链地址法。
2、C语言编写
3、具有创建/销毁/插入/删除/查找等基本功能。
...全文
242
14
打赏
收藏
十万火急!!!100分求HashTable源码
具体要求: 1、冲突检测采用链地址法。 2、C语言编写 3、具有创建/销毁/插入/删除/查找等基本功能。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaojun789
2006-03-08
打赏
举报
回复
up
DiabloWalkOnTheEarth
2005-08-09
打赏
举报
回复
哦不小心用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
打赏
举报
回复
直接求代码,视同作业
转新手乐园
HashTable
源码
(JDK1.7,含注释)
HashTable
源码
(JDK1.7,含注释)
HashTable
HashTable
源码
c# asp.net
hashtable
对Datalist分页
利用
hashtable
对Datalist分页,简单实用!
HashMap与
HashTable
和HashSet的区别
HashTable
不支持空键值对! 而HashMap支持空键值对!
java7hashmap
源码
-JAVA-:JAVA-
hashmap
源码
Notes 原理 basic 1 数据结构中各种东西的数量很很重要!!!可以考虑在在数据结构中定义一下 2 Java
hashtable
的contains用来查找是否存在value,和containsValue类似 查找key使用containskey方法, 3 ...
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章