1. 程式人生 > >數據結構——哈希表的構造和查找

數據結構——哈希表的構造和查找

info flag true char key值 技術分享 bsp truct ear

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define P 13
#define OK 1
#define ERROR 0
#define DUPLICATE -1
#define TRUE 1
#define FALSE 0
typedef struct   /*哈希表元素結構*/
{
    int key;  /*關鍵字值*/
    int flag; /*是否存放元素*/
} ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    
int count; /*元素個數*/ int sizeindex; /*當前哈希表容量*/ } HashTable; int d1[15]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*線性探測序列*/ int d2[15]= {0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探測序列*/ void dataset(int ds[],int *len); int InsertHash(HashTable *H,int e,int d[]); int CreateHash(HashTable *H,int
ds[],int len,int d[]); int SearchHash(HashTable *H, int e,int d[]); void menu(); /*輸入查找表*/ void dataset(int ds[],int *len) { int n,m; n=0; printf("\n查找表輸入:"); while(scanf("%d",&m)==1) /*以輸入一個非整數作為結束*/ { ds[n]=m; n++; } *len=n; } /*計算哈希地址,插入哈希表
*/ int InsertHash(HashTable *H,int e,int d[]) { int k,i=1; k=e%P; while(H->data[k].flag==TRUE||k<0) { k=(e%P+d[i])%MAXSIZE; i++; if(i>=15) return ERROR; } H->data[k].key=e; H->data[k].flag=TRUE; H->count++; return OK; } /*構造哈希表*/ int CreateHash(HashTable *H,int ds[],int len,int d[]) { int i; for(i=0; i<len; i++) { if(SearchHash(H,ds[i],d)!=-1) return DUPLICATE; InsertHash(H,ds[i],d); if(H->count>=MAXSIZE) return ERROR; } return OK; } /*初始化哈希表*/ void InitHash(HashTable *H) { int i; for(i=0; i<MAXSIZE; i++) { H->data[i].key=0; H->data[i].flag=FALSE; } } /*在哈希表中查找*/ int SearchHash(HashTable *H, int e,int d[]) { int k,i=1; k=e%P; while(H->data[k].key!=e) { k=(e%P+d[i])%MAXSIZE; i++; if(i>=15) return -1; } return k; } /*演示菜單*/ void menu() { int choice; int *p; HashTable h; h.count=0; h.sizeindex=MAXSIZE; int a[MAXSIZE]= {0}; int i,n,e; dataset(a,&n); /*建立查找表*/ getchar(); printf("\n"); do { printf("\n----哈希查找演示----\n"); printf("\n1.線性探測構造哈希表\n"); printf("\n2.二分探測構造哈希表\n"); printf("\n3.退出\n"); printf("\n輸入選擇:"); scanf("%d",&choice); if(choice==1) p=d1; else if(choice==2) p=d2; else return; InitHash(&h); /*初始化哈希表*/ if(!(i=CreateHash(&h,a,n,p))) /*構造哈希表*/ printf("\n哈希表構造失敗!\n"); else if(i==DUPLICATE) printf("\n哈希表具有重復關鍵字!\n"); else { printf("\n哈希表:\n"); for(i=0; i<h.sizeindex; i++) printf("%3d",h.data[i].key); printf("\n\n哈希查找\n輸入要查找的key值:"); getchar(); scanf("%d",&e); if((i=SearchHash(&h,e,p))==-1) printf("\n%d未找到\n",e); else printf("\n%d在哈希表中下標為%d\n",e,i); } getchar(); } while(1); } int main() { menu(); return 0; }

技術分享圖片

技術分享圖片

數據結構——哈希表的構造和查找