(完整word版)2014广工数据结构实验报告哈希表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构设计性实验报告
课程名称_____数据结构实验 _ 题目名称哈希表
学生学院__ 计算机学院______ 专业班级___
学号____
学生姓名____ _
指导教师___ ___
2015 年 7 月 2 日
1.题目
采用哈希表为存储结构,实现抽象数据类型HashTable。
ADT HAS{
数据对象D:D是具有相同特性的数据元素的集合。
数据关系R:根据设定的哈希函数和处理冲突的方法将一组关键字映像到一个连续的有限地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表。这一映像过程称为造表或散列,所得存储位置称哈希地址或散列地址。
基本操作:
InitHash(&H)
操作结果:初始化哈希表H。
DestoyHash(&H)
初始条件:哈希表H已存在。
操作结果:销毁哈希表H。
CreateHash(&H)
初始条件:哈希表H已存在。
操作结果:构造哈希表H。
SearchHash(H)
初始条件:哈希表已存在。
操作结果:查找哈希表H中元素。
InsertHash(&H)
初始条件:哈希表H已存在。
操作结果:插入元素到哈希表
DeleteHash(&H, key, &e)
初始条件:哈希表已存在且非空。
操作结果:删除H的第i个元素,并用e返回其值,H的长度减1。
} ADT List
3.算法设计
#include
#include
#include
#include
#include
#define random(x) (rand()%x)
#define OK 1
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICAPE -1
#define OVERFLOW 0
typedef int KeyType;
typedef int Status;
typedef struct {
KeyType key;
int tag;
}RecordrdType, RcdType;
typedef struct {
RcdType *rcd;
int size;
int count;
}HashTable;
int InitHash(HashTable *H, int size){ //初始化哈希表
int i;
H->rcd=(RcdType*)malloc(size*sizeof(RcdType));
if(NULL==H->rcd)return OVERFLOW;
for(i=0;i<=size;i++)H->rcd[i].tag=0;
H->size=size;
H->count=0;
return OK;
}
int DestoyHash(HashTable *H)//销毁哈希表
{
free(H->rcd);
H->rcd=NULL;
H->count=0;
H->size=0;
return OK;
}
int SearchHash(HashTable H, KeyType key , int &p,int &c ){ //查找哈希表c=0;
p=key%H.size;//求得哈希地址
while(H.rcd[p].tag!=0&&(H.rcd[p].key!=key||-1==H.rcd[p].tag)){
p=(p+1)%H.size;c++;
}//求得下一探测地址
if(H.rcd[p].key==key)return SUCCESS;
else return UNSUCCESS;
}
int InsertHash(HashTable *H, RcdType e){//哈希表的插入
int c=0,j;
if(SUCCESS==SearchHash(*H,e.key,j,c))
return -1;
else {
H->rcd[j]=e;H->rcd[j].tag=1;++H->count;
return c;
}
}
int DeleteHash(HashTable *H,KeyType key,RcdType e){ //哈希表的删除int j,c;
if(UNSUCCESS==SearchHash(*H,key,j,c))
return UNSUCCESS;
else {
e=H->rcd[j];
H->rcd[j].tag=-1;
H->count--;
return SUCCESS;
}
}
void display(HashTable *H){
printf("\n哈希表数据:");
for(int i=1;i
{
printf("%d ",H->rcd[i]);}
printf("\n");
}
4.测试
int main(){
int i,j,select,x1,x2,x3,x4,g,n,k,b,f;
RcdType e;
KeyType key;
srand(time(0)); //初始化随机种子