6-23 分离链接法的删除操作函数 (20 分)

试实现分离链接法的删除操作函数。

函数接口定义:

bool Delete( HashTable H, ElementType Key );

其中HashTable是分离链接散列表,定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;typedef struct TblNode *HashTable; /* 散列表类型 */
struct TblNode {   /* 散列表结点定义 */int TableSize; /* 表的最大长度 */List Heads;    /* 指向链表头结点的数组 */
};

函数Delete应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并删除之,然后输出一行文字:Key is deleted from list Heads[i],其中Key是传入的被删除的关键词,i是Key所在的链表的编号;最后返回true。如果Key不存在,则返回false。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>#define KEYLENGTH 15                   /* 关键词字符串的最大长度 */
typedef char ElementType[KEYLENGTH+1]; /* 关键词类型用字符串 */
typedef int Index;                     /* 散列地址类型 */
typedef enum {false, true} bool;typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;typedef struct TblNode *HashTable; /* 散列表类型 */
struct TblNode {   /* 散列表结点定义 */int TableSize; /* 表的最大长度 */List Heads;    /* 指向链表头结点的数组 */
};Index Hash( ElementType Key, int TableSize )
{return (Key[0]-'a')%TableSize;
}HashTable BuildTable(); /* 裁判实现,细节不表 */
bool Delete( HashTable H, ElementType Key );int main()
{HashTable H;ElementType Key;H = BuildTable(); scanf("%s", Key);if (Delete(H, Key) == false)printf("ERROR: %s is not found\n", Key);if (Delete(H, Key) == true)printf("Are you kidding me?\n");return 0;
}/* 你的代码将被嵌在这里 */

哈希表HashTable(Key,value)就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整形数字,然后就将该数字对数组长度进行取余,取余的结果就当作数组下标,将value存储在以该数字为下标的数组空间里
而当使用哈希表进行查询的时候,就是再次使用哈希函数将Key转换为对应的数组下标,并定位到该空间获取value,这样就可以充分利用到数组的定位性能进行数据定位

数组的特点是:寻址容易,插入和删除困难
链表的特点是:寻址困难,插入和删除容易

综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构:拉链法构建哈希表

解决冲突:分离链接法、开放寻址法

bool Delete( HashTable H, ElementType Key ){int w=Hash( Key, H->TableSize );//题目给的,不解释,读题目程序就好if(H->Heads[w].Next==NULL) return false;//判断有没有下一个节点PtrToLNode p,q;p=H->Heads[w].Next;//第一个位置没有存东西,所以直接到下一个节点while(strcmp(p->Data,Key)!=0&&p->Next!=NULL){q=p;//记录要删除的上一个节点p=p->Next;//节点移动}if(strcmp(p->Data,Key)==0){//找到printf("%s is deleted from list Heads[%d]\n",Key,w);q=p->Next;//删除操作free(p);//这一句必须写,不写会错,很迷return true;//样例  没有输出 printf("Are you kidding me?\n"); 不懂~~~}else return false;//找不到
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Visual Studio Code 进行远程开发

在完成了 AT 指令入门的学习之后&#xff0c;接下来就要使用 AT 指令进行 Socket 通信了。问题在于&#xff0c;之前 .NET 的 Socket 编程只需一台电脑便可进行学习&#xff0c;服务器和客户端都可以在本机运行&#xff0c;也可以分别运行在局域网上的两台电脑之上。而 NB-IOT …

AI人工智能

1&#xff0c;为什么要对特征做归一化&#xff1f; 2&#xff0c;什么是组合特征&#xff1f;如何处理高维组合特征&#xff1f; 3&#xff0c;请比较欧式距离与曼哈顿距离&#xff1f; 4&#xff0c;为什么一些场景中使用余弦相似度而不是欧式距离&#xff1f; 5&#xff0c;O…

python练习题

一、 请编写程序&#xff0c;使得能够计算以下算术运算并打印结果&#xff1a;9的3次方 print(9**3)二、 给你一个整数&#xff0c;代表Tom的妈妈买的书本的数量&#xff0c;输出一段英文&#xff0c;能完整表述Tom的妈妈买了几本书。本题考查字符串的组合、数据类型的变换、变…

.NETCore3.1中的Json互操作最全解读-收藏级

前言本文比较长&#xff0c;我建议大家先点赞、收藏后慢慢阅读&#xff0c;点赞再看&#xff0c;形成习惯&#xff01;我很高兴,.NETCore终于来到了3.1LTS版本&#xff0c;并且将支持3年&#xff0c;我们也准备让部分业务迁移到3.1上面&#xff0c;不过很快我们就遇到了新的问题…

在一个数组中实现两个堆栈

6-11 在一个数组中实现两个堆栈 (20 分) 本题要求在一个数组中实现两个堆栈。 函数接口定义&#xff1a; Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag );其中Tag是堆栈编号&#xff0c;取1或2&…

逻辑结构的四种基本关系

逻辑结构的四种基本关系 1集合结构&#xff1a;数据元素之间除了“属于同一集合”的关系外&#xff0c;没有其他关系 2线性结构&#xff1a;数据元素之间存在一对一的关系 3树结构&#xff1a;数据元素之间存在一对多的关系 4图结构&#xff1a;数据元素之间存在多对多的关系

轻量级开源小程序SDK发车啦

Magicodes.WxMiniProgram.Sdk轻量级微信小程序SDK&#xff0c;支持.NET Framework以及.NET Core。目前已提供Abp模块的封装&#xff0c;支持开箱即用。地址&#xff1a;https://github.com/xin-lai/Magicodes.WxMiniProgram.SdkNuget新的包主要功能轻量级微信小程序SDK&#xf…

单链表基础知识详解

//通常使用结构的嵌套来定义单向链表结点的数据类型 typedef struct Node *PtrToNode;//将Node命名为PtrToNode struct Node {ElementType Data;//存储结点数据PtrToNode Next&#xff1b;//指向下一个结点的指针 }; //结构类型Node中的Next分量又是该结构类型的指针&#xff0…

[译文] C# 8 已成旧闻, 向前, 抵达 C# 9!

C# 8 is old news. Onward, to C# 9! (C# 8 已成旧闻, 向前, 抵达 C# 9!)Did you know that planning is already underway for the ninth version of the C# language?第九版 C# 语言已经在开发中了, 你晓得伐?Now, to be fair, this has been in the planning phases long,…

考察对顺序表的理解

顺序表是在计算机内存中以数组的形式保存的线性表 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中&#xff0c;即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻…

2020年你应该学习 .Net Core

一、什么是.NET Core.NET Core是一个开源通用的开发框架&#xff0c;支持跨平台&#xff0c;即支持在Window&#xff0c;macOS&#xff0c;Linux等系统上的开发和部署&#xff0c;并且可以在硬件设备&#xff0c;云服务&#xff0c;和嵌入式/物联网方案中进行使用。.NET Core的…

对表头指针、表头结点,单链表删除的理解

https://blog.csdn.net/weixin_46678290/article/details/105309156

C# WPF发票打印

C# WPF发票打印内容目录实现效果业务场景编码实现本文参考源码下载1.实现效果发票界面PDF打印结果2.业务场景界面作为发票预览&#xff0c;按客户需求可打印成发票纸张给客户。3.编码实现3.1 添加Nuget库站长使用 .Net Core 3.1 创建的WPF工程&#xff0c;创建“Invoice”解决方…

对全局变量,static静态变量的理解

如果所有的变量按照下面的程序进行定义和声明&#xff0c;那么在main()函数中所有可用的变量为 &#xff08;&#xff09;。 void fun(int x) {static int y;……return; } int z; void main( ) {int a,b;fun(a);…… }A.x,y B.x,y,z C.a,b,z D.a,b,x,y,z static静态变量的值在…

dotNET知音,19年归档

2019年下半年开通公众号&#xff0c;尝试着分享和技术交流&#xff0c;也很高兴认识很多NETer同行。为了方便阅读&#xff0c;进行归档&#xff0c;如果之前有错过的文章&#xff0c;这是一个很好的补课机会。.NETCore3.0&#xff1a;《.Net Core3.0 配置Configuration》《.Net…

顺序表和链表的优缺点理解

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算&#xff0c;则利用哪种存储方式最节省时间&#xff1f;D A.双链表 B.单循环链表 C.带头结点的双循环链表 D.顺序表 想要存取任一指定序号的元素&#xff0c;链表实现这个功能的代价很大 本来顺序表的…

阿里如何应对亿级高并发大流量?如何保障高可用和稳定性!

作者&#xff1a;丁浪&#xff0c;目前在创业公司担任高级技术架构师。曾就职于阿里巴巴大文娱和蚂蚁金服。具有丰富的稳定性保障&#xff0c;全链路性能优化的经验。架构师社区特邀嘉宾&#xff01;阅读本文&#xff0c;你将会收获&#xff1a; 高并发、大流量场景的常见问题和…

中缀转后缀

从中序表达式 转换为 后序表达式 例题&#xff1a; 利用栈对表达式19/(8-5)*4求值的过程中&#xff0c;操作数栈的最大容量是多少&#xff1f;&#xff08;B &#xff09;。 A.3 B.4 C.5 D.2 操作数栈&#xff1a;先是/(- &#xff0c; 然后遇到)&#xff0c;则为/ &#xff0…

动手造轮子:写一个日志框架

动手造轮子&#xff1a;写一个日志框架Intro日志框架有很多&#xff0c;比如 log4net / nlog / serilog / microsoft.extensions.logging 等&#xff0c;如何在切换日志框架的时候做到不用修改代码&#xff0c;只需要切换不同的 loggingProvider 就可以了&#xff0c;最低成本的…

对循环队列的理解

循环队列存储在数组A[0…n-1]中&#xff0c;其头尾指针分别为f和r&#xff0c;头指针f总是指向队头元素&#xff0c;尾指针r总是指向队尾元素的下一个位置&#xff0c;则元素e入队时的操作为&#xff08;B &#xff09;。 A.A[r]e; rr1 B.A[r]e; r(r1)%n C.A[r]e;r(r1)%(n1) D.…