哈希表(链地址法)

本文介绍了一种使用链地址法实现的哈希表,详细展示了`hash.h`、`hash.c`和`main.c`三个源文件的代码实现。哈希表用于存储和查找数据,插入和查找操作高效。代码中定义了数据结构和相关操作,如`hash_creart`用于创建哈希表,`hash_insert`进行插入操作,`seek_hash`用于查找,`free_hash`则释放内存。在`main.c`中,通过用户输入数据进行测试,展示了哈希表的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链地址法原理

hash表链地址法

具体实现代码

hash.h

#ifndef _HASH_H_
#define _HASH_H_

typedef int data_t;

typedef struct node{
	data_t key;
	data_t value;
	struct node * next;
}link,*linklist;
 
typedef struct{
	linklist h;
	int maxlen;
}hash,*linhash;

linhash hash_creart(int len);
int hash_insert(linhash H,data_t data,int maxprime);
data_t seek_hash(linhash H,data_t data,int maxprime);
linhash free_hash(linhash H);

#endif

hash.c

#include<stdio.h>
#include"hash.h"
#include<stdlib.h>
#include<string.h>

linhash hash_creart(int len){
	linhash H;
	H = (linhash) malloc(sizeof(hash));
	if(H == NULL){
		return NULL;
	}
	H->h = (linklist)malloc(len * sizeof(link));
	memset(H->h,0,(len * sizeof(hash)));

	H->maxlen = len;

	return H;
}

int hash_insert(linhash H,data_t data,int maxprime){
		linklist p,q;
	p = (linklist)malloc(sizeof(link));
	if(p == NULL){
		return -1;
	}
	printf("1\n");
	p->key = data;
	p->value = data % maxprime;
	p->next = NULL;

	q = &(H->h[data % maxprime]);

	while(q->next && p->key > q->next->key){
		q = q->next;
	}
	p->next = q->next;
	q->next = p;

	return 0;

}

data_t seek_hash(linhash H,data_t data,int maxprime){
	linklist p;
	p = &(H->h[data % maxprime]);

	while(p->next && p->next->key != data){
		p = p->next;
	}
	if(p->next == NULL){
		printf("is no fond\n");
		return 0;
	}else{
		printf("is found\n");
		return p->next->key;
	}

}

linhash free_hash(linhash H){
	linklist p,q;
	int i;
	for(i = 0;i < H->maxlen;i++){
		p = &(H->h[i]);
		p = p->next;
		while(p){
			q = p;
			p=p->next;
			printf("free %d\n",q->key);
			free(q);
		}
	}
	free(H->h);
	free(H);
	return NULL;
}

main.c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"hash.h"

int main(){
	linhash H;
	int i,len,maxprime,n;
	data_t data,key;
	printf("input len:\n");
	scanf("%d",&len);
	H = hash_creart(len);
	if(len % 2 == 0){
		maxprime = len - 1;
	}else{
		maxprime = len;
	}
	n = (len * 75) / 100;
	
	i = 0;
	printf("the hash maxlen %d save data maxlen %d the maxprime %d\n",len,n,maxprime);
	printf("input data for insert\n");
	while(i < n){
		scanf("%d",&data);
		if(data == -1){
			break;
		}
		hash_insert(H,data,maxprime);
		i++;
	}

	printf("input data for seek\n");
	while(1){
		scanf("%d",&data);
		if(data == -1){
			break;
		}
		key = seek_hash(H,data,maxprime);
		printf("input data %d seek data %d\n",data,key);
	}

	H = free_hash(H);
	return 0;
}

代码执行结果

input len:
15
the hash maxlen 15 save data maxlen 11 the maxprime 15
input data for insert
23
34
14
38
46
16
68
15
7
31
26
input data for seek
23
is found
input data 23 seek data 23
14
is found
input data 14 seek data 14
46
is found
input data 46 seek data 46
10
is no fond

20
is no fond


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值