1. 程式人生 > >7-11 整型關鍵字的雜湊對映 (25 分)

7-11 整型關鍵字的雜湊對映 (25 分)

給定一系列整型關鍵字和素數P,用除留餘數法定義的雜湊函式將關鍵字對映到長度為P的散列表中。用線性探測法解決衝突。
輸入格式:

輸入第一行首先給出兩個正整數N(≤1000)和P(≥N的最小素數),分別為待插入的關鍵字總數、以及散列表的長度。第二行給出N個整型關鍵字。數字間以空格分隔。
輸出格式:

在一行內輸出每個整型關鍵字在散列表中的位置。數字間以空格分隔,但行末尾不得有多餘空格。
輸入樣例:

4 5
24 15 61 88

輸出樣例:

4 0 1 3

太坑了,這個題唯一的坑點就是 ,如果你輸入的有重複的數字,輸出第一次的位置
比如:
輸入:
4 5
24 24 24 24
輸出:
4 4 4 4;
程式碼:


    #include <cstdio>
#define MAX 100005
int table[MAX];
int visit[MAX];
int main() {
    int n,p;
    scanf( "%d%d", &n, &p );
    int m;
    for( int i = 0; i < n; i++ ) {
        scanf( "%d", &m );
        bool flag = false;
        for( int j = 0; j < p; j++ ) {
            if
( table[j] == m ) { flag = true; printf( " %d", j ); break; }//先在散列表的長度內找找有沒有重複的數字,如果有,flag=1,break跳出 } if( flag ) { continue;//找到重複的繼續下一次輸入,跳過下面程式 } int r = m % p;//沒有找到重複的就按照正常的方法探測 while( visit[
r] ) { r=(r+1)%p; } table[r]=m;//在散列表的r位置記錄m visit[r] = 1;//r標記為已經有元素佔有 if( i == 0 ) printf( "%d", r ); else printf( " %d", r ); } return 0; }