C语言中的两种hash表的实现

2014-10-05

1、用数组

#include <stdio.h>
#define N 4


typedef int datatype;
typedef struct
{
datatype key;
}Hretype;


int LHashsearch(Hretype HT[N], 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[N], 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[N];


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、用链表

#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[N], 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[N], 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[N];


    //指针数组初始化
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;
}

类别:编程相关 | 阅读:1057 | 评论:0 | 标签:c hash hash表

想收藏或者和大家分享这篇好文章→

“C语言中的两种hash表的实现”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

2014年10月4日创建

标签云

最近评论

友情链接