哈希表及其应用.docx
- 文档编号:5853735
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:14
- 大小:16.46KB
哈希表及其应用.docx
《哈希表及其应用.docx》由会员分享,可在线阅读,更多相关《哈希表及其应用.docx(14页珍藏版)》请在冰豆网上搜索。
哈希表及其应用
#include"stdafx.h"
#include
#include
#include
#include
usingnamespacestd;
#include
#definemax100
typedefstruct
{
intkey;
chardata;
charszName[10];
charszAddress[20];
intnNum;
}ElemType;//定义结点类型
typedefstruct
{
ElemTypeelems[max];
intlen;
}HashTable;//定义散列表类型
intstored[max];//标志数组
typedefstructElemNode//拉链法数据域
{
intkey;
ElemTypedata;
structElemNode*next;
}ElemNode;
typedefstruct
{
ElemNode*first;
intlen;
}ElemHeader,hashtable[max];
HashTableinitHashTable(intn)//ht:
散列表n:
散列表长度创建线性探测法哈希表
{
inti;
HashTableht;
ht.len=n;
for(i=0;i stored[i]=0;//标志数组,数组元素初始化为0 returnht; } intHash(HashTableht,intk) { returnk%ht.len; } intaddht(HashTable&ht,intx) { inti; intadd; i=Hash(ht,x); if(stored[i]==0) { cout<<"输入人名: "; cin>>ht.elems[i].szName; cout<<"输入地址: "; cin>>ht.elems[i].szAddress; cout<<"输入电话: "; cin>>ht.elems[i].nNum; ht.elems[i].key=x; stored[i]=1; } else { add=i; i=(i+1)%ht.len; while(i! =add&&stored[i]==1) i=(i+1)%ht.len; if(stored[i]==0) { cout<<"输入人名: "; cin>>ht.elems[i].szName; cout<<"输入地址: "; cin>>ht.elems[i].szAddress; cout<<"输入电话: "; cin>>ht.elems[i].nNum; ht.elems[i].key=x; stored[i]=1; } elseprintf("erroroccurred! "); } return0; } HashTableinsert(HashTableht,intx)//ht: 散列表ele: 插入结点 { inti,add; i=Hash(ht,x); if(stored[i]==0) { cout<<"输入人名: "; cin>>ht.elems[i].szName; cout<<"输入地址: "; cin>>ht.elems[i].szAddress; cout<<"输入电话: "; cin>>ht.elems[i].nNum; ht.elems[i].key=x; stored[i]=1; } else { add=i; i=(i+1)%ht.len; while(i! =add&&stored[i]==1) i=(i+1)%ht.len; if(stored[i]==0) { cout<<"输入人名: "; cin>>ht.elems[i].szName; cout<<"输入地址: "; cin>>ht.elems[i].szAddress; cout<<"输入电话: "; cin>>ht.elems[i].nNum; ht.elems[i].key=x; stored[i]=1; } elseprintf("erroroccurred! "); } returnht; } intsearch(HashTableht,intx)//ht: 散列表ele: 待查找结点 { inti,add; i=Hash(ht,x); if(stored[i]==1&&ht.elems[i].key==x) returni; else { add=i; i=(i+1)%ht.len; while(i! =add&&stored[i]==1&&ht.elems[i].key! =x) i=(i+1)%ht.len; if(ht.elems[i].key==x) returni; else { printf("cannotfind! "); return-1; } } } voiddelet(HashTableht,intx)//ht: 散列表ele: 待删除结点 { inti; i=search(ht,x); if(i! =-1) { stored[i]=0; } elseprintf("erroroccurred! "); } inthash(hashtableht2,intx)//数据除表长得关键字 { returnx%ht2->len; } voidaddht2(hashtable&ht2,intn) { inti; ElemNode*p; i=hash(ht2,n); p=(ElemNode*)malloc(sizeof(ElemNode)); p->key=n; cout<<"姓名: "; cin>>p->data.szName; cout<<"地址: "; cin>>p->data.szAddress; cout<<"号码: "; cin>>p->data.nNum; p->next=ht2[i].first; ht2[i].first=p; } voidInitHashTable(hashtableht2,intn)//链地址法创建哈希表 { inti; ht2->len=n; for(i=0;i ht2[i].first=NULL;//关键字的first域初始为NULL } voidInsert(hashtableht2,intx)//x为要插入的数据 { inti; ElemNode*p; i=hash(ht2,x); p=(ElemNode*)malloc(sizeof(ElemNode)); p->key=x; cout<<"姓名: "; cin>>p->data.szName; cout<<"地址: "; cin>>p->data.szAddress; cout<<"号码: "; cin>>p->data.nNum; p->next=ht2[i].first; ht2[i].first=p;//将p结点连接到相应关键字结点后面 } intSearch(hashtableht2,intx)//找到关键字 { inti; ElemNode*p; i=hash(ht2,x); p=ht2[i].first; while(p! =NULL&&p->key! =x) p=p->next; if(p! =NULL) return1; elsereturn0; } intdisplay1(HashTableht) { inti; //for(i=0;i //printf("%3d",i); //printf("\n"); for(i=0;i if(stored[i]==1) { cout< '<<"姓名: "< "< "< }//printf("%3d",ht.elems[i].key); return0;//printf(""); //printf("\n"); } voiddisplay2(hashtableht2) { inti; ElemNode*p; for(i=0;i { p=ht2[i].first; if(p! =NULL) { printf("%3d.",i); while(p! =NULL) { printf("%3d",p->key); cout<<"姓名: "< "< "< p=p->next; } printf("\n"); } elseprintf("%3d.\n",i); } } voidmenu() { printf("1.插入操作\n"); printf("2.查找操作\n"); printf("3.输出操作\n"); printf("4.删除操作\n"); printf("5.添加操作\n"); printf("6.退出\n"); } voidmenu1() { printf("1.插入操作\n"); printf("2.查找操作\n"); printf("3.添加操作\n"); printf("4.输出操作\n"); printf("5.退出\n"); } intmain() { HashTableht; hashtableht2; intop; ElemNode*p; inti,j,n,x,t; p=(ElemNode*)malloc(sizeof(ElemNode)); printf("请输入散列表的长度: "); scanf("%d",&n); InitHashTable(ht2,n); ht=initHashTable(n); //printf("请输入数据,不超过%d个,以负数结束: ",n); //scanf("%d",&x); /*while(x>=0) { ht=insert(ht,x); Insert(ht2,x); scanf("%d",&x); }*/ printf("====================散列表==================\n"); printf("--------------------------------------------\n"); printf("1: 线性探测法\n"); printf("2: 拉链法\n"); printf("3: 退出\n"); printf("--------------------------------------------\n"); while (1){ printf("请选择: "); scanf("%d",&t); switch(t) { case1: menu(); while (1) { printf("输入操作的数字: "); scanf("%d",&op); if(3==op) { printf("散列表中的结点如下: \n"); display1(ht); } if(2==op) { printf("请输入要查找的节点: "); scanf("%d",&x); i=search(ht,x); if(i! =-1) cout<<"姓名: "< "< "< elseprintf("该散列表中没有该值! \n"); printf("\n"); } if(5==op) { cout<<"输入结点关键字: "; cin>>x; addht(ht,x); } if(4==op) { printf("输入要删除的结点: "); scanf("%d",&x); printf("删除key为%d的结点…\n",x); delet(ht,x); printf("删除后,散列表中的结点如下: \n"); display1(ht); } if(1==op) { printf("请输入要插入的结点: "); scanf("%d",&x); printf("插入key为%d的结点…\n",x); ht=insert(ht,x); printf("插入后,散列表中的结点如下: \n"); display1(ht); } if(6==op) { break; } } case2: printf("\n\n"); printf("拉链法操作: \n"); menu1(); while (1) { printf("输入操作的数字: "); scanf("%d",&op); if(4==op) { printf("散列表中的结点如下: \n"); display2(ht2); } if(2==op) { intm; printf("请输入要查找的节点: "); scanf("%d",&x); j=Search(ht2,x); if(j==1) { ElemNode*p; p=ht2[j].first; cout<<"姓名: "< "< "< \n"); }elseprintf("结点没找到! \n"); } if(3==op) { printf("请输入结点位置(数字): "); scanf("%d",&x); addht2(ht2,x); } if(1==op) { printf("请输入要插入的结点: "); scanf("%d",&x); printf("插入key为%d的结点…\n",x); //ht=insert(ht,x); Insert(ht2,x); printf("插入后,散列表中的结点如下: \n"); display2(ht2); } if(5==op) { break; } } case3: exit(0); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 及其 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)