【散列表-链接法解决冲突】利用链接法来解决冲突的散列表

~~~~(>_<)~~~~,搞了好几天终于把这个做出来了。。

首先看一下这种散列表的结构:

1.每个槽都令其为NULL,注意里面保存的都是指向Node的指针,而不是结点哦~

2.然后我这里把链表的头结点,比如上图的k1,k5,k8的prior指针指向了T这个散列表,因为这样删除的时候会比较简单。

3.注意删除链表中的第一个结点和尾结点时候的不同方法哦。。因为这个耽误了3天时间啊。。。

好了,代码如下:

#include<stdio.h>

#include<stdlib.h>

typedef struct Node

{

int key;

Node *prior;

Node *next;

}Node;

typedef struct t

{

Node *firstarc;//利用指针数组

}T[100];

typedef struct Hash

{

T  hash;

int size;

}Hash;

Hash * Hash_create()

{

Hash *HashTable=(Hash *)malloc(sizeof(Hash));

printf("关键字全域U是多少?\n");

scanf("%d",&HashTable->size);

for(int i=0;i<HashTable->size;i++)

HashTable->hash[i].firstarc=NULL;//如果为T[]数组可以这么用,如果是指针不可以这么用

return HashTable;

}

void DIRECT_SEARCH_INSERT(Hash *HashTable,Node *node)

{

Node *p=(Node *)malloc(sizeof(Node));

p=HashTable->hash[node->key%HashTable->size].firstarc;

if(p==NULL)

{

HashTable->hash[node->key%HashTable->size].firstarc=node;

node->prior=HashTable->hash[node->key%HashTable->size].firstarc;

node->next=NULL;

}

else

{

Node *temp=(Node *)malloc(sizeof(Node));

temp->key=node->key;

temp->next=p;

p->prior=temp;

temp->prior=HashTable->hash[node->key%HashTable->size].firstarc;

HashTable->hash[node->key%HashTable->size].firstarc=temp;

}

}

void DIRECT_SEARCH_DELETE(Hash* HashTable,int key)

{

Node *p=HashTable->hash[key%HashTable->size].firstarc;

int i=1;

while(p->next!=NULL)

{

if(p->key==key)

{

p->prior->next=p->next;

p->next->prior=p->prior;

//free(p);

break;

}

p=p->next;

i++;

}

if(p->next==NULL&&i==1)

{

if(p->key==key)

{

HashTable->hash[key%HashTable->size].firstarc=NULL;

//free(p);

}

}

if(p->next==NULL&&i!=1)

{

if(p->key==key)

{

p->prior->next=NULL;

}

}

if(p->next==NULL)

{

if(p->key!=key)

printf("不存在这个值!\n");

}

}

void DIRECT_SEARCH_Search(Hash *HashTable,int key)

{

int i=1;

Node *p=HashTable->hash[key%HashTable->size].firstarc;

if(p==NULL)

{

printf("不存在这个值!\n");

return;

}

while(p->next!=NULL)

{

if(p->key==key)

{

printf("存在key=%d这个值,放在table[%d]这个链表的第%d个位置上\n",key,key%HashTable->size,i);

break;

}

p=p->next;

i++;

}

if(p->next==NULL)

{

if(p->key==key)

printf("存在key=%d这个值,放在table[%d]这个链表的第%d个位置上\n",key,key%HashTable->size,i);

else

printf("不存在这个值\n");

}

}

int main(void)

{

int key;

Hash *HashTable=(Hash *)malloc(sizeof(Hash));

HashTable=Hash_create();

printf("请输入一些数值,以#结束\n");

int ch;

while(scanf("%d",&ch)==1)

{

Node *node=(Node *)malloc(sizeof(node));

node->key=ch;

node->prior=node->next=NULL;

//printf("node->key=%d",node->key);

DIRECT_SEARCH_INSERT(HashTable,node);

}

//while(1)

//{

// printf("您要查找多少:");

// fflush(stdin);

// scanf("%d",&key);

// DIRECT_SEARCH_Search(HashTable,key);

//}

while(1)

{

printf("您要查找多少:");

fflush(stdin);

scanf("%d",&key);

DIRECT_SEARCH_Search(HashTable,key);

printf("您要删除多少:");

fflush(stdin);

scanf("%d",&key);

DIRECT_SEARCH_DELETE(HashTable,key);

}

结果展示:

时间: 2024-08-24 11:01:57

【散列表-链接法解决冲突】利用链接法来解决冲突的散列表的相关文章

数据结构与算法——散列表类的C++实现(分离链接散列表)

散列表简介: 散列表的实现常被称为散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术. 散列的基本思想: 理想的散列表数据结构只不过是一个包含一些项的具有固定大小的数组.(表的大小一般为素数) 设该数组的大小为TbaleSize,我们向该散列表中插入数据,首先我们将该数据用一个函数(散列函数)映射一个数值x(位于0到TbaleSize1-1之间):然后将该数据插入到散列表的第x的单元.(如果有多个数据映射到同一个数值,这个时候就会发生冲突) 散列函数介绍: 为了避免散列函数生成的值不是

解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题

解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 有时候当用远程桌面链接某台Windows主机的时候会出现"The RPC server is unavailable."的问题,并在日志里还会看到如下图所示的错误: RPC 

微信端解决a标签链接 失效的问题

最近常碰到这个问题就是 在微信端点击a标签链接的时候,第一次正常界面跳转.但是,界面重新跳转回来再次点击a标签的话 .出现 界面不跳转,但是进度条加载完毕,点击多次页面无法跳转. 解决办法 在链接后边加上随机的参数(我这边加载的是时间戳): 比如说 $td参数 在控制器里面生成 部分安卓手机测试没发现之前的问题!!!!! iPhone手机部分检测也咩问题!!!!!!

解决本地软件链接不上虚拟机mysql 的问题:grant all privileges on *.* to &#39;root&#39;@&#39;%&#39; identified by &#39;nsfocus&#39;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION; //本地操作的权限 mysql> GRANT ALL PRIVILEGES ON *.* TO ' root '@'%' ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION; 首先要声明一下:一般情况下,修改MySQL

解决mysql 远程链接问题

grant all privileges on *.* to 'root'@'192.168.2.204' identified by '123456' with grant option;flush privileges; 可直接用下面的,上面的执行之后,仅本机可以用ip进行链接,还是不能远程链接,下面的就ok了. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; flush

利用IFA法进行个人目标实现

利用IFA法目标实现(一) 一.背景 1)主要原因:一直以来,我觉得计划对于实现目标非常重要.但是从2010年至今,我的各种各样计划几乎都全部流产,以至于我丧失了对于制定计划的兴趣.当然,抛弃制定计划之后,我仍然没有能够完成我的目标.翻看往年计划本,2013年2月份的时候,我的计划中就提到了问题的根源可能在于在于制定计划的方法上,但是没有加以重视. 2)催化剂:今年两次考GRE以及一次托福考试,匆匆忙忙的抢考位.预定酒店.车票和机票,然后临时抱佛脚,最后结果也十分不理想.仔细分析,解决问题的方法

svn冲突问题详解 SVN版本冲突解决详解

(摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上次更新版本.当前获取的版本,即别人提交的版本.自己更新的版本.目标文件. 开发人员都知道代码管理工具是开发中一个必不可少的工具,这里也不废话详细介绍了.不管你个人喜欢git还是svn还是其他,但

解决《利用python进行数据分析》P139报错问题 index must be monotonic increasing or decreasing

解决<利用python进行数据分析>P139报错问题 index must be monotonic increasing or decreasingframe.reindex(index=['a','b','c','d'],method='ffill',columns=states)报错:index must be monotonic increasing or decreasing 修改代码:把method=‘ffill’拿出来注意,是method的方法,参数ffill后面加"(

转载&gt;&gt; svn冲突问题详解 SVN版本冲突解决详解

本文转自http://www.cr173.com/html/46224_1.html 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生 时,subversion会在WorkCopy中保存所有的目标文件版本(上次更新版本.当前获取的版本,即别人提交的版本.自己更新的版本.目标文件. 开发人员都知道代码管理工具是开发中一个必不可少的工具,这里也不废话详细介绍了.不管你个人喜欢git还是svn还是其他,但还有一大部分公司在

拉丁矩阵问题 利用回溯法的C++实现方案

这两天正好在赶算法设计的作业,这里把做的几个需要写代码的题放上来,方便以后查看. 1.题目要求 2.算法思想 这个题目基本思想是 利用回溯法,对于 m 行 n 列, 本质上就是一个二维数组, 我们可以将问题的解写成 x[1],x[2],x[3] - x[m*n], 那么对于每个点 x[i] 的取值实际上是 [1, n], 套用回溯法的算法框架,这里的 约束条件 ,就是同行,同列 没有相同的取值, 并且这里没有优化目标,只要类似 N后问题找出所有解就可以了. 另外,回溯时候的边界条件,需要特别注意