• swust oj 1012


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

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

    输入

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

    输出

    如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。

    样例输入

    13
    13
    16 74 60 43 54 90 46 31 29 88 77 78 79
    16
    

    样例输出

    3,1
      1 #include<iostream>
      2 #include<algorithm>
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<list>
      8 #define rep(i,a,b) for(int i=a;i<b;i++)
      9 using namespace std;
     10 typedef int KeyType;
     11 typedef struct node
     12 {
     13     KeyType key;
     14     struct node *next;
     15 }NodeType;
     16 typedef struct{
     17     NodeType *firstp;
     18 }HashTable;
     19 
     20 void InsertHT(HashTable ha[],int &n,int p,KeyType k)
     21 {
     22     int adr;
     23     adr=k%p;
     24     NodeType *q,*r;
     25     q=(NodeType *)malloc(sizeof(NodeType));
     26     q->next=NULL;
     27     q->key=k;
     28     if(ha[adr].firstp==NULL)
     29         ha[adr].firstp=q;
     30     else
     31     {
     32         r=ha[adr].firstp;
     33         while(r->next!=NULL)
     34         {
     35             r=r->next;
     36         }
     37         r->next=q;
     38     }
     39     n++;
     40 }
     41 
     42 void creatHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int nl)
     43 {
     44     rep(i,0,m)
     45     ha[i].firstp=NULL;
     46     n=0;
     47     rep(i,0,nl)
     48     InsertHT(ha,n,p,keys[i]);
     49 }
     50 
     51 bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k)
     52 {
     53     int adr;
     54     adr=k%p;
     55     NodeType *q,*preq;
     56     q=ha[adr].firstp;
     57     if(q==NULL)
     58         return false;
     59     if(q->key==k)
     60     {
     61         ha[adr].firstp=q->next;
     62         free(q);
     63         n--;
     64         return true;
     65     }
     66     preq=q;
     67     q=q->next;
     68     while(q!=NULL)
     69     {
     70         if(q->key==k)
     71             break;
     72         q=q->next;
     73     }
     74     if(q!=NULL)
     75     {
     76         preq->next=q->next;
     77         free(q);
     78         n--;
     79         return true;
     80     }
     81     else
     82         return false;
     83 }
     84 
     85 void serchHT(HashTable ha[],int p,KeyType k)
     86 {
     87     int i=0,adr;
     88     adr=k%p;
     89     NodeType *q;
     90     q=ha[adr].firstp;
     91     while(q!=NULL)
     92     {
     93         i++;
     94         if(q->key==k)
     95             break;
     96         q=q->next;
     97     }
     98     if(q!=NULL)
     99         cout<<k%p<<","<<i;
    100     else
    101         cout<<"-1";
    102 }
    103 
    104 int main()
    105 {
    106     int m,n,k,x;
    107     KeyType keys[1000];
    108     HashTable ha[100];
    109     cin>>m>>n;
    110     rep(i,0,n)
    111         cin>>keys[i];
    112     cin>>k;
    113     creatHT(ha,x,m,m,keys,n);
    114     serchHT(ha,m,k);
    115     rep(i,0,n)
    116         DeleteHT(ha,x,m,m,keys[i]);
    117     return 0;
    118 }
  • 相关阅读:
    Lightoj 1082【RMQ】
    hrbust1444 逃脱 【BFS】
    萌新学习笔记之哈夫曼树
    lightoj 1085【离散化+树状数组】
    CodeForces 586D【BFS】
    lightoj 1089 【离散化+线段树】
    lightoj 1088【树状数组+离散化】
    《算法导论》笔记 第6章 6.2保持堆的性质
    《算法导论》笔记 第6章 6.1堆
    【python】__all__
  • 原文地址:https://www.cnblogs.com/Iwpml-595/p/10713023.html
Copyright © 2020-2023  润新知