链地址法哈希表c语言

本文介绍了一种名为BKDRHash的哈希函数实现,用于高效地将字符串映射到哈希表地址,并探讨了如何在C语言中插入、展示和删除节点,涉及数据结构如链表和查找功能。重点在于使用BKDRHash进行键值对管理及基本的数据库操作实践。
摘要由CSDN通过智能技术生成
#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语言实现哈希表地址)的例子: ```c #include <stdio.h> #include <stdlib.h> #define SIZE 10 // 哈希表大小 // 哈希表节点结构体 typedef struct Node { int data; struct Node *next; } Node; // 哈希表结构体 typedef struct HashTable { Node *head[SIZE]; } HashTable; // 哈希函数 int hash(int data) { return data % SIZE; } // 初始化哈希表 HashTable* init() { HashTable *hashTable = (HashTable*)malloc(sizeof(HashTable)); for (int i = 0; i < SIZE; i++) { hashTable->head[i] = NULL; } return hashTable; } // 插入数据 void insert(HashTable *hashTable, int data) { int key = hash(data); Node *node = (Node*)malloc(sizeof(Node)); node->data = data; node->next = NULL; if (hashTable->head[key] == NULL) { hashTable->head[key] = node; } else { Node *p = hashTable->head[key]; while (p->next != NULL) { p = p->next; } p->next = node; } } // 查找数据 int search(HashTable *hashTable, int data) { int key = hash(data); Node *p = hashTable->head[key]; while (p != NULL) { if (p->data == data) { return 1; } p = p->next; } return 0; } // 删除数据 void delete(HashTable *hashTable, int data) { int key = hash(data); Node *p = hashTable->head[key]; Node *prev = NULL; while (p != NULL) { if (p->data == data) { if (prev == NULL) { hashTable->head[key] = p->next; } else { prev->next = p->next; } free(p); return; } prev = p; p = p->next; } } // 打印哈希表 void print(HashTable *hashTable) { for (int i = 0; i < SIZE; i++) { printf("%d: ", i); Node *p = hashTable->head[i]; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } } int main() { HashTable *hashTable = init(); insert(hashTable, 1); insert(hashTable, 11); insert(hashTable, 21); insert(hashTable, 31); insert(hashTable, 41); print(hashTable); printf("search %d: %d\n", 11, search(hashTable, 11)); printf("search %d: %d\n", 12, search(hashTable, 12)); delete(hashTable, 11); print(hashTable); return 0; } ``` 以上代码哈希表使用解决哈希冲突。其哈希表结构体包含一个指向节点表头的指针数组,节点结构体包含一个数据域和一个指向下一个节点的指针。初始化哈希表时,将每个表头初始化为NULL。插入数据时,先计算数据的哈希值,然后将节点插入到对应的表尾部。查找数据时,先计算数据的哈希值,然后遍历对应表查找数据。删除数据时,也是先计算数据的哈希值,然后遍历对应表查找数据,找到后删除节点并释放空间。最后,打印哈希表时,遍历指针数组的每个表,输出的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值