哈希链表 操作大全 实现
//------------------------------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内核哈希链表的添删查在用户态应用,通过简单的实例表现出来
不用我多说了,常用的一些基本数据结构,可以直接用于项目开发的,便于大家学习交流。
从内核提取出来的list.h, 通用链表, 哈希链表数据结构及操作函数, 在用户态正常使用
用c语言实现了简单的哈希链表 10000000条数据每秒中查找几百万次 速度非常快
哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表
windows application which demo hash linktable.
PDF文档,介绍一种基于哈希链表的高效概念漂移连续属性处理算法。
Java数据结构 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构
将linux内核源码中list.h拿出来, 增删与遍历部分写了详细注释, 关于链表合并, 没用过所以没写. 源码版本是2.6.32, 不过链表的源码改动应该不是很大. 我的邮箱2253238252@qq.com, 代码有什么不对的欢迎发邮件给我
实现基于哈希表的员工信息管理系统,该系统主要用于处理员工信息,主要包括员工个人信息的录入、删除、查找、修改等,同时支持数据的导入导出
用C实现的哈希表 int hash_insert(Hash* * hp,int data)//返回0表示成功 { if((*hp) == NULL)return 1; if(((*hp)->num)==14) { printf("hash full\n"); return 1;//哈希表满了 } if((*hp)->pNode[KEY(data...
哈希表的哈希取余法和链表地址法来实现哈希表的基本操作。。。
1. hash key值计算,key的比较,内存分配,可以通过实现模板类重新定制 2. 实现按插入时间的先后,通过有序链表访问节点。用于按照时间先后,快速遍历... hash 实现快速存取, 链表快速实现超时hash节点的删除。
线性表,链表,哈希表
设计以姓名为关键字的散列表(哈希表),实现通讯录查找系统,完成相应的建表和查表程序。 (1)设每个记录有下列数据项:用户名、电话号码、地址; (2)从键盘输入各记录,分别以姓名为关键字建立散列表; (3)...
①(1) 选用线性表(静态表/动态表 Array or linked list : 单向链表/双向链表/双向循环链表) ②(2) 非线性结构实现: 二叉搜索树(Binary Search Tree) ③(3) 非线性结构实现: AVL树 ④(4) 非线性...
哈希表(使用键值标识元素,键值一样的元素即认为相等,需重载 == 运算符并由用户定义哈希函数) binstree.h: 二叉搜索树(需重载 == 和 运算符) avltree.h: AVL 树(需重载 == 和 运算符) <br>如果要...
. c实现的哈希表。哈希函数采用除留余数法,处理哈希冲突采用链地址法。包含设计文档!在dev c++上验证过。. vs2010 中有代码.有修改过一些BUG.
c语言实现哈希表,,,已经在vc++6.0上调试通过,2.txt中的内容为 12 19 14 23 1 68 20 84 27 55 11 10 79
链表操作: 插入 附加 回报指数 更新索引 删除索引 插入前索引 插入后索引 删除数据 删除所有数据 insertAfterEveryData insertBeforeEveryData 删除列表 复制列表 findMthToLastNode 类型: 带头指针的单 LL 双 LL ...