`
pleasetojava
  • 浏览: 732727 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

哈希链表 操作大全 实现

 
阅读更多

哈希链表 操作大全 实现

//------------------------------Struct.h----------------------

#define MAX 100

struct ElemStruct
{
char str[MAX];
char info[MAX];
ElemStruct *next;
};

struct TableStruct
{
ElemStruct *link;
};

//-------------------------------HashTable.h--------------------

#include "stdafx.h"
#include "Struct.h"
#include<cstring>


template <class DataType>
class HashTable
{
private:
int hashFunc(const DataType &obj)
{
int sum = 0;
for(int i=0;i<strlen(obj.str);i++)
sum += (int)obj.str[i];
return sum%size;
}
TableStruct *table;
int size;

public:
HashTable(int s)
{
size = s;
table = (TableStruct*)malloc(sizeof(TableStruct)*size);;
for(int i = 0;i<getSize();i++)
table[i].link = NULL;
}

int getSize()
{
return size;
}

int find(const DataType &key)
{
int location = hashFunc(key);
if( location < 0 || location> getSize())
return -1;
else if(table[location].link==NULL)
return 0;
else
{
DataType *p = table[location].link;
while(p != NULL)
{
if(!strcmp(key.str,p->str))
return 1;
p = p->next;
}
return 0;
}
}


int insert(const DataType &newObject)
{
int location = hashFunc(newObject);
if(location < 0 || location> getSize())
return -1;
else
{
int flag = find(newObject);
if(flag==1)
return 0;
else if(flag==0)
{
DataType *p1 = (DataType*)malloc(sizeof(DataType));
strcpy_s(p1->str,newObject.str);
strcpy_s(p1->info,newObject.info);
p1->next = table[location].link;
table[location].link = p1;
return 1;
}
}
}

int remove(DataType &removeObject)
{
int location = hashFunc(removeObject);
if( location < 0 || location> getSize())
return -1;
else
{
DataType *p,*q;
p=q= table[location].link;
while(p != NULL)
{
if(!strcmp(p->str,removeObject.str))
{
if(p==q)
{
table[location].link = p->next;
}
else
{
q->next = p->next;
}
return 1;
}
q = p;
p = p->next;
}
return 0;
}
}

int update(DataType &updateObject)
{
int location = hashFunc(updateObject);
if( location < 0 || location> getSize())
return -1;
else
{
DataType *p = table[location].link;
while(p != NULL)
{
if(!strcmp(p->str,updateObject.str))
{
//关键字不能更新,只能更新其信息
strcpy_s(p->info,updateObject.info);
return 1;
}
p = p->next;
}
return 0;
}
}

void makeEmpty()
{
for(int i = 0;i<getSize();i++)
table[i].link = NULL;
}
};

//---------------------主函数-------------------------

// 散列表实现.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include"HashTable.h"
#include<iostream>
using namespace std;

const int SIZE = 199;


int _tmain(int argc, _TCHAR* argv[])
{
HashTable<ElemStruct> ht(SIZE);
cout<<"---------------------请选择需要进行的操作-----------------------"<<endl;
cout<<"------插入哈希链表(I/i)-------"<<endl;
cout<<"------查找哈希链表(S/s)-------"<<endl;
cout<<"------移除哈希元素(R/r)-------"<<endl;
cout<<"------更新哈希元素(U/u)------"<<endl;
cout<<"------清空哈希链表(C/c)------"<<endl;
cout<<"------退出操作(E/e)------------"<<endl;
char cmd;
cin>>cmd;
while(1)
{
if(cmd=='I'||cmd=='i')
{
cout<<"请输入需要插入的这些元素,以0结束:"<<endl;
ElemStruct myStruct;
while(1)
{
cout<<"输入关键字:";
cin>>myStruct.str;
if(!strcmp(myStruct.str,"0"))
break;
cout<<"输入信息:";
cin>>myStruct.info;
myStruct.next = NULL;
int flag = ht.insert(myStruct);
if(flag == -1)
cout<<"哈希散列值非法,此元素非法!"<<endl;
else if(flag == 0)
cout<<"此元素已存在!"<<endl;
else if(flag == 1)
cout<<"插入成功!"<<endl;
}
}
else if(cmd=='S'||cmd=='s')
{
cout<<"请输入需要查询的这些元素,以0结束:"<<endl;
ElemStruct myStruct;
while(1)
{
cout<<"输入关键字:";
cin>>myStruct.str;
if(!strcmp(myStruct.str,"0"))
break;
myStruct.next = NULL;
int flag = ht.find(myStruct);
if(flag == -1)
cout<<"哈希散列值非法,此元素非法!"<<endl;
else if(flag == 0)
cout<<"此元素不存在!"<<endl;
else if(flag == 1)
cout<<"查询成功!"<<endl;
}
}
else if(cmd=='R'||cmd=='r')
{
cout<<"请输入需要移除的这些元素,以0结束:"<<endl;
ElemStruct myStruct;
while(1)
{
cout<<"输入关键字:";
cin>>myStruct.str;
if(!strcmp(myStruct.str,"0"))
break;
myStruct.next = NULL;
int flag = ht.remove(myStruct);
if(flag == -1)
cout<<"哈希散列值非法,此元素非法!"<<endl;
else if(flag == 0)
cout<<"此元素不存在!"<<endl;
else if(flag == 1)
cout<<"移除成功!"<<endl;
}
}
else if(cmd=='U'||cmd=='u')
{
cout<<"请输入需要更新的这些元素,以0结束:"<<endl;
ElemStruct myStruct;
while(1)
{
cout<<"输入需要更新的元素的关键字:";
cin>>myStruct.str;
if(!strcmp(myStruct.str,"0"))
break;
cout<<"输入需要更新的信息:";
cin>>myStruct.info;
myStruct.next = NULL;
int flag = ht.update(myStruct);
if(flag == -1)
cout<<"哈希散列值非法,此元素非法!"<<endl;
else if(flag == 0)
cout<<"此元素不存在!"<<endl;
else if(flag == 1)
cout<<"更新成功!"<<endl;
}
}
else if(cmd=='C'||cmd=='c')
{
cout<<"如果清空,所有元素都将不存在了!确定要清空(Y/y)?"<<endl;
char cmd1;
cin>>cmd1;
if(cmd1=='Y'||cmd1=='y')
ht.makeEmpty();
cout<<"清空成功!"<<endl;
}
else if(cmd=='E'||cmd=='e')
break;
else
{
cout<<"命令不正确,请重新输入!"<<endl;
}
cout<<"---------------------请选择需要进行的操作-----------------------"<<endl;
cin>>cmd;
}
system("pause");
return 0;
}

分享到:
评论

相关推荐

    linux内核哈希链表在用户态应用

    本主题将深入探讨如何在用户态应用Linux内核哈希链表,以及如何通过实例来实现这些基本操作。 首先,理解Linux内核哈希链表的基础概念至关重要。哈希链表由一个哈希表数组和每个数组元素所对应的链表组成。哈希函数...

    哈希链表c语言实现,可以直接用来做项目

    在C语言中实现哈希链表,需要理解哈希函数、链表结构以及如何将两者结合起来。这里我们将深入探讨哈希链表的概念、C语言中的实现方法以及其在项目中的应用。 哈希链表的核心在于哈希函数,它能够将输入(通常为字符...

    windows vc++ 哈希链表

    在这个特定的示例中,我们关注的是"windows vc++ 哈希链表",它是一个演示如何在C++环境中实现哈希链表的Windows应用。 哈希链表是数据结构的一种,它结合了哈希表的快速查找特性与链表的灵活存储方式。哈希表通过...

    内核通用链表哈希链表表list.h

    哈希链表的操作函数包括: 1. 初始化哈希桶:`hlist_head_init(head)` 初始化一个哈希桶。 2. 插入节点:`hlist_add_head(node, head)` 将`node`插入到`head`的头部;`hlist_add_behind(node, prev)` 插入到`prev`...

    哈希表相关操作实现

    在给定的博客中,可能会详细介绍这些概念,并通过实例演示如何实现哈希表的基本操作。通过学习哈希表,我们可以更好地理解数据结构和算法,提升软件开发的效率和质量。无论是编程语言的内置数据结构,如Python的dict...

    c 哈希链表

    用c语言实现了简单的哈希链表 10000000条数据每秒中查找几百万次 速度非常快

    基于哈希链表的简单人员信息管理系统

    ### 基于哈希链表的简单...通过以上详细解析,我们可以清晰地了解到基于哈希链表的简单人员信息管理系统的各个方面,从项目背景、功能实现到技术细节都有所涉及,有助于深入理解和掌握此类系统的开发过程和技术要点。

    哈希表------链表

    哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表

    Linux代码分析 本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。

    除了基本链表,2.6内核还引入了两种扩展:读拷贝更新(Read-Copy-Update,RCU)链表和哈希链表(hlist)。RCU是一种优化机制,适用于多读者单写作者的场景,保证在更新链表时不会立即释放旧链表,直到所有读者都完成...

    哈希表的设计与实现C语言

    哈希表是一种高效的数据结构,它通过特定的算法——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。在C语言中,实现哈希表需要理解其基本原理,并掌握如何利用...

    C语言实现链表,创建、插入、查找、删除、遍历等基本操作

    在本主题中,我们将深入探讨如何使用C语言实现链表的基本操作,包括创建、插入、查找、删除和遍历。 1. **链表创建**: 创建链表首先需要定义一个结构体类型来表示链表的节点,通常包含数据部分和指向下一个节点的...

    严蔚敏-数据结构--链表实现c++实现

    6. **链表应用**:链表常用于实现堆栈、队列、哈希表、图和树等数据结构,以及在各种算法中,如快速排序、归并排序、LRU缓存淘汰策略等。 总的来说,《严蔚敏-数据结构》中的链表实现章节会详细讲解这些概念,并...

    C++哈希算法的实现

    综上所述,C++哈希表的实现涉及哈希函数的设计、冲突处理策略的选择以及相应的插入、查找和删除操作。理解这些概念并能够灵活应用,对于提升C++编程的效率和解决问题的能力至关重要。在实际开发中,可以根据具体需求...

    哈希表C++代码实现

    哈希表是一种高效的数据结构,它通过特定的函数(哈希函数)将键(key)映射到一个固定大小的数组中的索引位置,从而实现快速查找、插入和删除操作。在C++中,虽然标准库提供了`std::unordered_map`和`std::...

    链表的基本操作实现、还有一种链表排序、还有一个2链表的合并

    链表是一种常用的数据结构,它在计算机科学中扮演着重要的角色。相较于数组,链表的主要优点在于其动态性,可以在运行时...在实际应用中,链表常用于实现栈、队列、哈希表等复杂数据结构,因此深入学习链表至关重要。

    C语言链表操作

    通过学习和实践这些知识点,你可以掌握C语言中链表和哈希表的基本操作,这对于理解和实现更复杂的算法和数据结构至关重要。在实际项目中,这些基础数据结构和操作是许多高效解决方案的基础,比如缓存系统、数据库...

    哈希表的设计与实现哈希表的设计与实现

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,以此实现快速的插入、查找和删除操作。在本设计中,哈希表被用于存储和查询电话通讯信息,包括电话号码、用户名和地址等...

    c实现的哈希表(除留余数法、链地址法)(包含设计文档)

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,以此实现快速查找、插入和删除操作。在这个项目中,哈希表是用C语言实现的,采用了除留余数法作为哈希函数,并使用链地址...

    哈希表设计 哈希表的具体实现代码

    哈希表,也被称为散列表,是数据结构中一种高效的数据存储方式,它通过特定的哈希函数将关键字映射到一个固定大小的数组中,从而实现快速的查找、插入和删除操作。在计算机科学中,哈希表的性能优势在于它的平均时间...

Global site tag (gtag.js) - Google Analytics