哈希表(链地址法处理冲突)
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 }