实验8 Hash表的建立和查找

根据本班同学的学号建立hash表,Hash(d)=d%31,其中d为每个同学的学号后4位,冲突解决办法使用线性探测再散列方法。

#include<stdio.h>
#include<stdlib.h>
#define M 32
#define P 31
typedef struct 
{
    long long int ID;
    int flag;
}Hash;
Hash hashtable[32];
void  initHash()
{
    for(int i=1;i<=M;i++)
    {
        hashtable[i].flag=1;
    }
}
int getHashAdd(int d)
{
    return d%P;
}
int insert(long long int id,int d)
{
    int add=getHashAdd(d);
    if(hashtable[add].flag==1)
    {
        hashtable[add].ID=id;
        hashtable[add].flag=0;
    }
    else
    {
        while(hashtable[add].flag==0)
        {
            add++;
            if(add==M+1)
            add=1;
        }
        hashtable[add].ID=id;
        hashtable[add].flag=0;
    }
}
int find(int d,long long int id)
{
    int add=getHashAdd(d);
    int x=add;
    while(!(hashtable[add].flag==0&&hashtable[add].ID==id))
    {
        add++;
        if(add==M+1)
        add=1;
        if(add==x)
        {
            return -1; 
        }
    }
    return add;
}
int main()
{
    long long int ID[32],id;
    int d,address;
    initHash();
    printf("请输入12位学号:\n");
    for(int i=1;i<=32;i++)
    {
        scanf("%lld",&ID[i]);
        d=ID[i]%22016121000;
        insert(ID[i],d);
    }
    printf("请输入要查找的学号:\n");
    while(1)
    {
    scanf("%lld",&id);
    d=id%22016121000;
    address=find(d,id);
    if(address==-1)
    printf("没有找到");
    else
    printf("%d %lld\n",address,hashtable[address].ID);
    } 
 } 

测试数据:

220161214062
220161214022
220161214001
220161214010
220161214040
220161214121
220161214107
220161214005
220161214016
220161214113
220161214070
220161214093
220161214127
220161214041
220161214088
220161214080
220161214015
220161214008
220161214059
220161214025
220161214018
220161214068
220161214110
220161214118
220161214075
220161214017
220161214066
220161214109
220161214009
220161214081
220161214069
220161214042

测试结果:

220161214062 1
220161214022 23
220161214001 2
220161214010 11
220161214040 10
220161214121 29
220161214107 15
220161214005 6
220161214016 17
220161214113 21
220161214070 9
220161214093 3
220161214127 4
220161214041 12
220161214088 27
220161214080 19
220161214015 16
220161214008 13
220161214059 30
220161214025 26
220161214018 20
220161214068 7
220161214110 18
220161214118 28
220161214075 14
220161214017 22
220161214066 5
220161214109 24
220161214009 25
220161214081 31
220161214069 8
220161214042 32

posted @ 2018-01-02 10:22  Hztiger  阅读(410)  评论(0编辑  收藏  举报