当前位置: 首页 > article >正文

分别写出在散列表中插入和删除关键字为K的一个记录的算法,设散列函数为H,解决冲突的方法为链地址法。

#include<stdbool.h>
//定义链表结构
typedef struct LNode
{
	int data;
	struct LNode* next;
}LNode,*LinkList;
//假设散列表的大小为100
#define TABLE_SIZE 100
LinkList HT[TABLE_SIZE];

//散列函数
int hash(int data)
{
	return data % TABLE_SIZE;//所有data都会存储在0-TABLE_SIZE-1的位置里面
}

void initialize_hash_table()
{
	//给每个链表申请空间
	for (int i = 0; i < TABLE_SIZE; i++)
	{
		HT[i] = (LinkList)malloc(sizeof(LNode));
		if (HT[i] == NULL)
		{
			perror("error");
			exit(1);
		}
		HT[i]->next = NULL;
	}
}

//插入
bool insert(int data)
{
	int ant = hash(data);//拿到哈希地址
	LinkList p = HT[ant];//p指向这个哈希地址

	while (p->next)//判断HT[ant]后的data有没有跟当前的相等
	{
		if (p->next->data == data)
		{
			return false;
		}
		p = p->next;
	}

	//没相等的data就插入新节点
	LinkList s = (LinkList)malloc(sizeof(LNode));
	if (s == NULL)
	{
		perror("error:");
		return false;
	}
	s->data = data;
	s->next = p->next;
	p->next = s;
	return true;
}

//删除函数
bool delete_key(int data)
{
	int ant = hash(data);
	LinkList p = HT[ant];

	while (p->next)
	{
		if (p->next->data == data)
		{
			LinkList s = p->next;
			p->next = s->next;
			free(s);
			return true;
		}
		p = p->next;
	}
	return false;
}
int main()
{
	//初始化链表
	initialize_hash_table();
	insert(1);
	insert(10);
	insert(20);
	insert(30);
	insert(10);//插入失败的

	for (int i = 0; i < 100; i++) {
		LinkList p = HT[i]->next;
		if (p != NULL) {
			printf("Slot %d: %d\n", i, p->data);
		}
	}
	printf("\n");

	delete_key(10);
	delete_key(1);

	for (int i = 0; i < TABLE_SIZE; i++) {
		LinkList p = HT[i]->next;
		if (p != NULL) {
			printf("Slot %d: %d\n", i, p->data);
		}
	}

	for (int i = 0; i < TABLE_SIZE; i++)
	{
		free(HT[i]);
	}
	return 0;
}


http://www.kler.cn/a/397007.html

相关文章:

  • Flume和kafka的整合
  • Zero、Zero-Offload、Zero-Infinity是什么
  • 安装paddle
  • shell编程之变量与引用
  • 【C#设计模式(11)——外观模式(Facade Pattern)】
  • 【Linux】Linux 权限的理解
  • 蓝桥杯模拟
  • 动态规划 —— 子数组系列-乘积为正数的最长子数组长度
  • arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现
  • 基于RK3568J多网口电力可信物联网关解决方案
  • leetcode day10 动态规划篇 64+139
  • 通过JS实现下载图片到本地教程分享
  • 23种设计模式-观察者(Observer)设计模式
  • 数据分析-Excel基础操作
  • 变摩擦系数在机械中的应用
  • 蓝队基础5 -- 安全策略与防护技术
  • WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇
  • 代码随想录算法训练营day41|动态规划04
  • [IP组播]IGMP配置实验
  • WebSocket Endpoint端点
  • 【Go语言——数据结构】稀疏数组(SparseArray)
  • AutoUpdater.NET 实现 dotNET应用自动更新
  • paramiko 库实现的暴力破解 SSH 密码
  • 建筑企业新闻稿怎么写?工程行业评职称品牌宣传背书的报纸期刊杂志媒体有哪些
  • 实现 MVC 模式
  • 第23课-C++-红黑树的插入与旋转