#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
char key[200];
char value[200];
Node *next;
}Node;
unsigned int BKDRHash(char *str,int Hash_Size)//unsigned?
{
unsigned int seed = 31; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;
while (*str)
{
hash = (hash * seed + (*str++))% Hash_Size;
}
return (hash% Hash_Size); //使hash函数返回值在hash表的有效地址范围
}
void insert(char key[],Node &node,int n)
{
Node *p=&node;
while(p->key[0]!=0)
{
p=p->next;
}
int k=BKDRHash(key,n);
memset(p->key,'\0',200);
memset(p->key,'\0',200);
strcpy(p->key,key);
scanf("%s",p->value);
Node *tail=(Node *)malloc(sizeof(Node));
memset(tail->key,0,200);
p->next=tail;
tail->next=NULL;
}
void show(Node node[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s %s\n",node[i].key,node[i].value);
Node *p=&node[i];
if(!p->next)//避开空结点
continue;
p=p->next;
while(p->key[0]!=0)
{
printf("%s %s\n",p->key,p->value);
p=p->next;
}
}
}
void init(Node node[],int m,int n)
{
for(int i=0;i<m;i++)
{
char key[200]={'\0'};
scanf("%s",key);
insert(key,node[BKDRHash(key,n)],n);
}
}
void find(Node node[],int n)
{
char temp[200]={'\0'};
scanf("%s",temp);
int i=BKDRHash(temp,n);
printf("%d ",i);
Node *p=&node[i];
while(p->key[0]!=0)
{
printf("%s ",p->key);
if(!strcmp(p->key,temp))
{
printf("%s",p->value);
break;
}
p=p->next;
}
if(p->key[0]==0)
{
printf("NULL");
}
}
void insert(Node node[],int n)
{
char temp[200]={'\0'};
scanf("%s",temp);
int i=BKDRHash(temp,n);
Node *p=&node[i];
if(!p->next)
{
strcpy(p->key,temp);
scanf("%s",p->value);
}
else
{
while(p->key[0]!=0)
{
p=p->next;
}
memset(p->key,'\0',200);
memset(p->value,'\0',200);
strcpy(p->key,temp);
scanf("%s",p->value);
}
Node *tail=(Node *)malloc(sizeof(Node));
memset(tail->key,'\0',200);
p->next=tail;
tail->next=NULL;
printf("%d\n",i);
}
void desert(Node node[],int n)
{
char temp[200]={'\0'};
scanf("%s",temp);
int i=BKDRHash(temp,n);
printf("%d ",i);
Node *p=&node[i];
if(!p->next)
{
if(!strcmp(temp,p->key))
{
printf("%s ",temp);
memset(p->key,'\0',200);
memset(p->value,'\0',200);
}
else
{
printf("%s NULL\n",temp);
}
}
else
{
Node *p1=&node[i];
p=p->next;
while(p->key[0]!=0)
{
printf("%s ",p1->key);
if(!strcmp(p->key,temp))
{
printf("%s",p->key);
p1->next=p->next;
Node *temp=p;
p=p->next;
free(temp);
printf("\n");
return;
}
p=p->next;
p1=p1->next;
}
if(p->key[0]==0)
{
printf("%s %s",p1->key,temp);
printf("NULL\n");
}
}
}
int main()
{
int i,n,m;
scanf("%d %d",&n,&m);
Node node[n]={0};
init(node,m,n);
insert(node,n);
desert(node,n);
find(node,n);
//show(node,n);
return 0;
}
链地址法哈希表c语言
最新推荐文章于 2022-05-26 11:31:03 发布
本文介绍了一种名为BKDRHash的哈希函数实现,用于高效地将字符串映射到哈希表地址,并探讨了如何在C语言中插入、展示和删除节点,涉及数据结构如链表和查找功能。重点在于使用BKDRHash进行键值对管理及基本的数据库操作实践。
摘要由CSDN通过智能技术生成