////1 哈希表操作,采用线性探测法处理冲突
////采用除留余数法定义哈希表,哈希表长度为10,哈希函数为H(key)=key%13。产生冲突时采用线性探测法实现下面要求的功能。
////(1)初始化哈希表,置空哈希表
////(2)在哈希表中查找元素
////(3)在哈希表中插入元素
////(4)输出哈希表中所有元素
////(5)建立Hash表
#include "stdio.h"
#define M 13
#define N 12
struct hterm
{
int key;//关键字值
int si;//散列次数
};
struct hterm hashlist[M+1];
int i,address,sum,d,x[N+1];
float average;
main()
{ for(i=1;i<=M;i++)//置初值
{ hashlist[i].key=0;
hashlist[i].si=0;
}
x[1]=19;x[2]=14;x[3]=23;x[4]=1;
x[5]=68;x[6]=20;x[7]=84;x[8]=27;
x[9]=55;x[10]=11;x[11]=10;x[12]=79;
for(i=1;i<=N;i++)
{ sum=0;
address=x[i]%M;
d=address;
if(hashlist[address].key==0)
{ hashlist[address].key=x[i];
hashlist[address].si=1;
}
else
{ do //处理冲突
{ d=(d+1)%M;
sum=sum+1;
}while (hashlist[d].key!=0);
hashlist[d].key=x[i];
hashlist[d].si=sum+1;
}
}
printf("散列表地址: ");
for(i=0;i<M;i++) printf("%-4d",i);
printf("\n");
printf("散列表关键字:");
for(i=0;i<M;i++) printf("%-4d",hashlist[i].key);
printf("\n");
printf("查找长度: ");
for(i=0;i<M;i++) printf("%-4d",hashlist[i].si);
printf("\n");
average=0;
for(i=0;i<M;i++) average=average+hashlist[i].si;
average=average/N;
printf("平均查找长度:ASL(%d)=%g",N,average);
}
//
//#include <stdio.h>
//#include <malloc.h>
//#include <stdio.h>
//
///**** 哈希表类型的定义****/
//#define NIL 0 // 用NIL作为空闲单元的标志
//#define DelNIL -1 // 用DelNIL作为已删除单元的标志
//#define m 13 // mod number
//#define n 20 //hash 长度
//
//
//typedef struct
//{
// int key; //关键字
//}LHashTable;
//
///****初始化哈希表****/
//void HashListInit(LHashTable HT[n])
//{
// int i;
// for(i=0;i<n;i++) //初始化 关键字-0
// HT[i].key=NIL;
//}
//
///**** 清空哈希表 ****/
//void HashListClear (LHashTable HT[])
//{
// int i;
// for(i=0;i<n;i++) // 关键字-0
// HT[i].key=NIL;
//}
//
///****定义哈希函数****/
//int Hash(int k) // 返回余数
//{
// return (k%m);
//}
//
///****在哈希表中查找元素****/
//int HashListSearch(LHashTable HT[n],int k) // -1:没有找到,other-找到
//{
// int d,temp;
// d=Hash(k); // 计算k的哈希地址
// temp=d; // temp暂存k的哈希地址
// while(HT[d].key!=NIL)
// {
// if(HT[d].key==k)
// return d; // 在哈希表中查找到元素k
// else
// d=(d+1)%n; // 没找到进行线性探测法继续查找
// if(d==temp)
// return -1; //哈希中没有待查元素k
// }
// return -1;
//}
//
///****在哈希表中插入一个元素****/
//void HashListInsert(LHashTable HT[n],int k)
//{
// int d,temp;
// d=Hash(k); // 计算k的哈希地址
// temp=d; //temp暂存k的哈希地址
// while(HT[d].key!=NIL&&HT[d].key!=DelNIL) // 当前位置已有元素
// {
// d=(d+1)%n; //进行线性探测
// if(d==temp)
// {
// printf("哈希表已满\n"); // 哈希表已满
// exit(1); //退出
// }
// }
// HT[d].key=k; // 插入k
//}
//
///***从哈希表中删除元素****/
//void HashListDelete(LHashTable HT[n],int k)
//{int d,temp;
// d=Hash(k);
// temp=d;
// while(HT[d].key!=NIL)
// {
// if(HT[d].key==k)
// {
// HT[d].key=DelNIL; // 找到k,删除标志
// return ;
// }
// else
// d=(d+1)%n; //当前位置没找到k,进行线性探测
// if(d==temp)
// break;
// }
// printf("哈希表中无待删除元素%d",k);
// exit(1);
//}
//
///****输出哈希表中所有元素****/
//void PrintHashList(LHashTable HT[n])
//{
// int i;
// for(i=0;i<n;i++)
// printf(" %d ",i);
// printf("\n");
// for(i=0;i<n;i++)
// printf(" %d ",HT[i]);
//}
//
//
//
//
//
//
//main()
//{
//
// int k,i;
// LHashTable HT[n];
// HashListInit(HT); // 初始化
//
// for(i=1;i<13;i++) // 给 hash 赋值
// HashListInsert(HT,i);
//
// HashListInsert(HT,13); // 0
// HashListInsert(HT,13); // 0
// HashListInsert(HT,26); // 0
// HashListInsert(HT,39); // 0
// HashListInsert(HT,17);
// HashListInsert(HT,14);
//
// printf("所建立的哈希表长为20\n");
// printf("所建立的哈希表为:\n");
// PrintHashList(HT);
// printf("\n");
// printf("请输入要删除的关键字:");
// scanf("%d",&k);
// HashListDelete(HT,k);
// printf("删除成功后的哈希表为:\n");
// PrintHashList(HT);
//system("pause");
//
//}
- 1
- 2
前往页