哈希表的操作

#include<stdio.h>
typedef int keytype;
typedef struct      /*元素类型定义*/
{
    keytype key;    /*关键字*/
    int hi;         /*冲突次数*/
}DataType;
typedef struct      /*哈希表类型定义*/
{
    DataType *data;
    int tablesize;  /*哈希表的长度*/
    int cursize;    /*表中关键字个数*/
}HashTable;
void CreateHashTable(HashTable *H,int m,int p,int hash[],int n)
/*构造一个空的哈希表,并处理冲突*/
{
    int i,sum,addr,di,k=1;
    (*H).data=(DataType *)malloc(m*sizeof(DataType));
    /*为哈希表分配空间*/
    if(!(*H).data)
        exit(-1);
    for(i=0;i<m;i++)    /*初始化哈希表*/
    {
        (*H).data[i].key=-1;
        (*H).data[i].hi=0;
    }
    for(i=0;i<n;i++)    /*求哈希函数地址并处理冲突*/
    {
        sum=0;          /*冲突的次数*/
        addr=hash[i]%p; /*利用除留余数法求哈希函数的地址*/
        di=addr;
        if((*H).data[addr].key==-1)
        /*如果不冲突则将元素存储在表中*/
        {
            (*H).data[addr].key=hash[i];
            (*H).data[addr].hi=1;
        }
        else            /*用线性探测再散列法处理冲突*/
        {
            do
            {
                di=(di+k)%m;
                sum+=1;
            }while((*H).data[di].key!=-1);
            (*H).data[di].key=hash[i];
            (*H).data[di].hi=sum+1;
        }
    }
    (*H).cursize=n;     /*哈希表中关键字个数为n*/
    (*H).tablesize=m;   /*哈希表的长度*/
}
int SearchHash(HashTable H,keytype k)
/*在哈希表H中查找关键字为k的元素*/
{
    int d,d1,m;
    m=H.tablesize;
    d=d1=k%m;           /*求k的哈希地址*/
    while(H.data[d].key!=-1)
    {
        if(H.data[d].key==k) /*如果是要查找的关键字k,则返回k的位置*/
            return d;
        else
            d=(d+1)%m;
        if(d==d1)           /*如果查找了哈希表中的所有位置,没有找到返回0*/
            return 0;
    }
    return 0;               /*该位置不存在关键字k*/
}
void HashASL(HashTable H,int m)
/*求哈希表的平均长度*/
{
    float average=0;
    int i;
    for(i=0;i<m;i++)
        average=average+H.data[i].hi;
    average=average/H.cursize;
    printf("平均查找长度ASL=%.2f",average);
    printf("\n");
}
void DisplayHash(HashTable H,int m) /*输出哈希表*/
{
    int i;
    printf("哈希表地址:");
    for(i=0;i<m;i++)
        printf("%-5d",i);
    printf("\n");
    printf("关键字key:");
    for(i=0;i<m;i++)
        printf("%-5d",H.data[i].key);
    printf("\n");
    printf("冲突次数:");
    for(i=0;i<m;i++)
        printf("%-5d",H.data[i].hi);
    printf("\n");
}
main()
{
    int Hash[]={23,35,12,56,123,39,342,90};
    int m=11,p=11,n=8,pos;
    keytype k;
    HashTable H;
    CreateHashTable(&H,m,p,Hash,n);
    DisplayHash(H,m);
    k=123;
    pos=SearchHash(H,k);
    printf("关键字%d在哈希表中的位置为:%d\n",k,pos);
    HashASL(H,m);
}

程序运行结果如图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻58

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值