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 }

猜你喜欢

转载自www.cnblogs.com/Iwpml-595/p/10713023.html