【hash表】两种实现(链地址法,开放地址法)
2014-12-01 01:49
253 查看
Hash表是计算机里面最重要的一种表。
常见有链地址法 List [ N ] 和 开放地址法 Pair<key, value>
.
简单实现 原文:http://blog.csdn.net/zhangjieting/article/details/5647033
plaincopy
#include <stdio.h>
#define N 4
typedef int datatype;
typedef struct
{
datatype key;
}Hretype;
int LHashsearch(Hretype HT
, datatype k)
{
int addr,i=0;
addr = k % N;
while(i<N && HT[addr].key != -1 && HT[addr].key != k)
{
i++;
addr = (addr+1)%N;
}
if(i == N)
return -1; //表溢出
else
return addr;
}
int LHinsert(Hretype HT
, Hretype R)
{
int addr;
addr = LHashsearch(HT, R.key);
if(addr==-1 || HT[addr].key == R.key)
{
return 1;
}
else
{
HT[addr] = R;
return 0;
}
}
int main()
{
Hretype R[6];
Hretype HT
;
for(int i=0;i<N;i++)
HT[i].key = -1;
for(i=0;i<6;i++)
R[i].key = i;
for(i=0;i<6;i++)
{
int value = LHinsert(HT,R[i]);
if(value)
printf("表溢出或记录已存在!/n");
else
{
printf("插入成功!/n");
}
}
return 0;
}
plaincopy
#include <stdio.h>
#include <stdlib.h>
#define N 4
typedef int datatype;
typedef struct node
{
datatype key;
struct node *next;
}Renode;
Renode *LinkHsearch(Renode *HT
, datatype k)
{
Renode *p;
int addr = k % N;
p = HT[addr];
while(p && p->key !=k)
p = p->next;
return p;
}
void LinkHinsert(Renode *HT
, Renode *S)
{
int addr;
Renode *p;
p = LinkHsearch(HT,S->key);
if(p)
{
printf("记录已存在/n");
free(S);
}
else
{
addr = S->key % N;
S->next = HT[addr];
HT[addr] = S;
printf("已插入/n");
}
}
int main()
{
Renode *HT
;
//指针数组初始化
for(int i=0;i<N;i++)
HT[i] = NULL;
for(i=0;i<6;i++)
{
Renode *S = (Renode*)malloc(sizeof(Renode));
S->key = i;
LinkHinsert(HT,S);
}
for(i=0;i<6;i++)
{
Renode *S = (Renode*)malloc(sizeof(Renode));
S->key = i;
LinkHinsert(HT,S); //注意指针数组实参
}
return 0;
}
常见有链地址法 List [ N ] 和 开放地址法 Pair<key, value>
.
简单实现 原文:http://blog.csdn.net/zhangjieting/article/details/5647033
1、开放地址法
[c-sharp] viewplaincopy
#include <stdio.h>
#define N 4
typedef int datatype;
typedef struct
{
datatype key;
}Hretype;
int LHashsearch(Hretype HT
, datatype k)
{
int addr,i=0;
addr = k % N;
while(i<N && HT[addr].key != -1 && HT[addr].key != k)
{
i++;
addr = (addr+1)%N;
}
if(i == N)
return -1; //表溢出
else
return addr;
}
int LHinsert(Hretype HT
, Hretype R)
{
int addr;
addr = LHashsearch(HT, R.key);
if(addr==-1 || HT[addr].key == R.key)
{
return 1;
}
else
{
HT[addr] = R;
return 0;
}
}
int main()
{
Hretype R[6];
Hretype HT
;
for(int i=0;i<N;i++)
HT[i].key = -1;
for(i=0;i<6;i++)
R[i].key = i;
for(i=0;i<6;i++)
{
int value = LHinsert(HT,R[i]);
if(value)
printf("表溢出或记录已存在!/n");
else
{
printf("插入成功!/n");
}
}
return 0;
}
2、用链表 链地址法
[c-sharp] viewplaincopy
#include <stdio.h>
#include <stdlib.h>
#define N 4
typedef int datatype;
typedef struct node
{
datatype key;
struct node *next;
}Renode;
Renode *LinkHsearch(Renode *HT
, datatype k)
{
Renode *p;
int addr = k % N;
p = HT[addr];
while(p && p->key !=k)
p = p->next;
return p;
}
void LinkHinsert(Renode *HT
, Renode *S)
{
int addr;
Renode *p;
p = LinkHsearch(HT,S->key);
if(p)
{
printf("记录已存在/n");
free(S);
}
else
{
addr = S->key % N;
S->next = HT[addr];
HT[addr] = S;
printf("已插入/n");
}
}
int main()
{
Renode *HT
;
//指针数组初始化
for(int i=0;i<N;i++)
HT[i] = NULL;
for(i=0;i<6;i++)
{
Renode *S = (Renode*)malloc(sizeof(Renode));
S->key = i;
LinkHinsert(HT,S);
}
for(i=0;i<6;i++)
{
Renode *S = (Renode*)malloc(sizeof(Renode));
S->key = i;
LinkHinsert(HT,S); //注意指针数组实参
}
return 0;
}
相关文章推荐
- 两种实现PPC地址重映射的方案,uboot powerpc
- 交换函数的两种不同的实现方式------地址传递和引用参数
- 用两种方式实现基于源地址的策略路由
- 交换函数的两种不同的实现方式------地址传递和引用参数
- 链地址法实现一个很简单的hash表
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
- 两种实现PPC地址重映射的方案
- 交换函数的两种不同的实现方式------地址传递和引用参数
- 两种不同情况的分页实现
- JavaBean实现多文件上传的两种方法
- 使用Session记录页面地址和实现页面返回功能
- 在ASP.Net中两种利用CSS实现多界面的方法.
- 编程实现邮件地址有效性检测
- C#实现Singleton的两种方法的比较
- 在ASP.Net中两种利用CSS实现多界面的方法. (转)
- JavaBean实现多文件上传的两种方法
- JS类定义原型方法的两种实现的区别
- 在ASP.Net中两种利用CSS实现多界面的方法
- 实现一个线程的两种方法
- Windows XP/2000实现自动登陆(加入域和未加域两种情况)