哈希表(链地址法处理冲突)(1012)

 

Description
 

    采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法。建立链表的时候采用尾插法。

 

Input
    第一行为哈西表的长度;第二行为关键字的个数n; 第三行为关键字集合; 第四行为要查找的数据。

 

Output
    如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。
 
Sample Input
1
2
3
4
5
13
13
16 74 60 43 54 90 46 31 29 88 77 78 79
16
 
Sample Output
 
 
 
1
3,1
 
 
#include<iostream>
#include<cstring>
using namespace std;
typedef struct node
{
    int data;
    struct node *next;
}Chain;
typedef struct
{
    Chain *head[100];
    int len, n;
}HashTable;
Chain * tail[100];
HashTable ha;
void InsertHT()
{
    int adr, k;
    Chain *p = new Chain;
    cin >> k;
    adr = k%ha.len;
    p->data = k;
    p->next = NULL;
    if (!ha.head[adr])
    {
        ha.head[adr] = p;
        tail[adr] = ha.head[adr];
    }
    else
    {
        tail[adr]->next = p;
        tail[adr] = p;
    }
}
void CreateHT(int len, int n)
{
    ha.len = len, ha.n = n;
    for (int i = 0; i < n; i++)
        ha.head[i] = NULL;
    for (int i = 0; i < n; i++)
        InsertHT();
}
void Search(int x)
{
    int adr = x%ha.len, flag = 0, cnt = 0;
    Chain *p = ha.head[adr];
    while (p)
    {
        cnt++;
        if (p->data == x)
        {
            flag = 1;
            break;
        }
        else
            p = p->next;
    }
    if (flag)cout << adr << ',' << cnt;
    else cout << "-1";
}
int main()
{
    int len, n, x;
    cin >> len >> n;
    CreateHT(len, n); 
    cin >> x;
    Search(x);
    return 0;
}
View Code

 

 
posted @ 2015-06-16 09:13  soldierwing  阅读(3170)  评论(0编辑  收藏  举报