哈希表

1。

#include <iostream>

using namespace std;

struct Hash{
    int k;
    struct Hash*next;
};

int main()
{
    int n;
    cin>>n;
    int q=11;
    Hash**group=new Hash*[q];
    for(int i=0;i<q;i++){
        group[i]=new Hash;//不要丢!!
        group[i]->k=-1;
        group[i]->next=NULL;
    }

    for(int i=0;i<n;i++){
        int num;
        cin>>num;
        int z=num%11;
        if(group[z]->k==-1){
            group[z]->k=num;
        }else{
            Hash*flag=new Hash;
                Hash*head=group[z];
                flag->k=num;
                flag->next=head;
                group[z]=flag;//此时head指向的地址有没有变,没有
        }
    }
    int t;
    cin>>t;
    while(t--){
        int m;
        cin>>m;
        int z=m%11;
        Hash*fin=group[z];
        int key=0;
        bool ans=false;
        while(fin){
            key++;
            if(fin->k==m){
                cout<<z<<" "<<key<<endl;
                ans=true;
                break;
            }else{
                fin=fin->next;
            }
        }
        if(!ans){
           cout<<"error"<<endl;
           if(group[z]->k==-1){
               group[z]->k=m;
            }else{
                Hash*flag=new Hash;
                Hash*head=group[z];
                flag->k=m;
                flag->next=head;
                group[z]=flag;
            }
        }
    }
    return 0;
}

2。

#include <iostream>

using namespace std;


int H(int key){
   return key%11;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int m,n;
        cin>>m>>n;
        int*group=new int[m];
        for(int i=0;i<m;i++){
            group[i]=-1;
        }
        for(int i=0;i<n;i++){
            int num;
            cin>>num;
            int z=H(num);
            while(group[z%m]!=-1){
                z++;//是否会越界,用z%m来解决
            }
            group[z%m]=num;
        }
        for(int i=0;i<m;i++){
            if(group[i]==-1){
                cout<<"NULL";
            }else{
                cout<<group[i];
            }
            if(i!=m-1){
                cout<<" ";
            }
        }
        int k;
        cin>>k;
        while(k--){
            int num;
            cin>>num;
            int ans=0;
            int fin=0;
            int z=H(num);
            while(fin<6){
                    fin++;
                if(group[z%m]==-1){
                    break;
                }

                if(group[z%m]==num){
                    ans=1;
                    break;
                }
                z++;
            }
            if(ans==0){
                cout<<ans<<" "<<fin<<endl;
            }else{
                cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
            }
        }

    }
    return 0;
}

上面的错了

#include <iostream>

using namespace std;


int H(int key){
   return key%11;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int m,n;
        cin>>m>>n;
        int*group=new int[m];
        for(int i=0;i<m;i++){
            group[i]=-1;
        }
        for(int i=0;i<n;i++){
            int num;
            cin>>num;
            int z=H(num);
            while(group[z%m]!=-1){
                z++;
            }
            group[z%m]=num;
        }
        for(int i=0;i<m;i++){
            if(group[i]==-1){
                cout<<"NULL";
            }else{
                cout<<group[i];
            }
            if(i!=m-1){
                cout<<" ";
            }else{
                cout<<endl;
            }
        }
        int k;
        cin>>k;
        while(k--){
            int num;
            cin>>num;
            int ans=0;
            int fin=0;
            int z=H(num);
            while(true){
                    fin++;
                if(group[z%m]==-1){
                    break;
                }

                if(group[z%m]==num){
                    ans=1;
                    break;
                }
                z++;
            }
            if(ans==0){
                cout<<ans<<" "<<fin<<endl;
            }else{
                cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
            }
        }

    }
    return 0;
}

3.

#include <iostream>
#include<math.h>
using namespace std;


int H(int key){
   return key%11;
}
int main()
{
    int t;
    cin>>t;
    while(t--){

        int m,n;
        cin>>m>>n;

        int*group=new int[m];
        for(int i=0;i<m;i++){
            group[i]=-1;
        }
        for(int i=0;i<n;i++){
            int num;
            cin>>num;
            int z=H(num);
            int zz=z;
            int kk=1;
            while(group[z%m]!=-1){
                if(kk%2==1){
                    z=zz+pow((kk+1)/2,2);
                }else{
                    z=zz-pow(kk/2,2);
                }
                while(z<0){
                    z+=m;
                }
                kk++;
            }
            group[z%m]=num;
        }
        for(int i=0;i<m;i++){
            if(group[i]==-1){
                cout<<"NULL";
            }else{
                cout<<group[i];
            }
            if(i!=m-1){
                cout<<" ";
            }else{
                cout<<endl;
            }
        }


        int k;
        cin>>k;
        while(k--){
            int num;
            cin>>num;
            int ans=0;
            int fin=0;
            int z=H(num);
            int zz=z;
            int kk=1;
            while(true){
                fin++;
                if(group[z%m]==-1){
                    break;
                }
                if(group[z%m]==num){
                    ans=1;
                    break;
                }
                if(kk%2==1){
                    z=zz+pow((kk+1)/2,2);
                }else{
                    z=zz-pow(kk/2,2);
                }
                while(z<0){
                    z+=m;
                }
                kk++;
            }
            if(ans==0){
                cout<<ans<<" "<<fin<<endl;
            }else{
                cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
            }
        }

    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值