西南科技大学OJ题 哈希表(链地址法处理冲突)1012

哈希表(链地址法处理冲突)

 1000(ms)

 10000(kb)

 2526 / 6473

采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法。建立链表的时候采用尾插法。

输入

第一行为哈西表的长度m;
第二行为关键字的个数n; 
第三行为关键字集合; 
第四行为要查找的数据。

输出

如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。

样例输入

13
13
16 74 60 43 54 90 46 31 29 88 77 78 79
16

样例输出

3,1
#include<stdio.h>
#include<malloc.h>
struct HTNode//储存值和下一个结点的结构体 
{
	int key;
	struct HTNode *next;
};
struct HashTable//储存头结点的结构体 
{
	struct HTNode *head;
};
void InstHT(HashTable ha[],int n)
{
	for(int i=0;i<n;i++)
	{
		ha[i].head=NULL;
	}
}
void CreateHT(HashTable ha[],int n,int data)//创建哈希表 
{
	int t=data%n;//计算哈希地址序号 
	if(ha[t].head==NULL)//如果该序号的头结点为空 
	{
		HTNode *p;
		p=(struct HTNode*)malloc(sizeof(struct HTNode));
		p->key=data;//储存数据 
		p->next=NULL;//将下一个结点设置为空 
		ha[t].head=p;//赋值给头结点 
	}
	else//如果头结点不为空,则从头结点一直往后找到最后一个结点 
	{
		HTNode *p,*q;
		p=ha[t].head;
		while(p->next!=NULL) p=p->next;//查找到最后一个结点 
		q=(struct HTNode*)malloc(sizeof(struct HTNode));
		q->key=data;
		q->next=NULL;
		p->next=q;//将新的结点接到最后 
	}
}
void SearchHT(HashTable ha[],int n,int data)//查找哈希表 
{
	int t=data%n;//计算哈希地址序号 
	HTNode *p;
	p=ha[t].head;
	for(int i=0; ;i++)//查找对应序号的链表 
	{
		if(p==NULL)//如果为空,则没有,输出-1
		{
			printf("-1");
			break;
		}
		else if(p->key==data)//如果有,则输出答案,并且跳出循环 
		{
			printf("%d,%d",t,i+1);
			break;
		}
		else p=p->next;//否则继续向后查找 
	}
}
int main()
{
	int n,k,data;
	scanf("%d",&n);
	scanf("%d",&k);
	HashTable ha[n];
	InstHT(ha,n);
	for(int i=0;i<k;i++)
	{
		scanf("%d",&data);
		CreateHT(ha,n,data);
	}
	scanf("%d",&data);
	SearchHT(ha,n,data);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值