雜湊查詢-圖書館查詢
阿新 • • 發佈:2018-12-15
下面用雜湊查詢來解決一個實際問題:圖書館查詢問題。
圖書館裡面有若干本書(至少3000本,至多30000本),為幫助使用者快速查詢每本書所在的書架位置,請設計一個模擬 系統實現基於圖書編號的快速查詢方法。
輸入:書的數目n,每本書的ISBN、書名、圖書所在書架的行、列。查詢的次數q,要查詢的圖書的ISBN號。
輸出:對於每本要查詢的書,輸出其書名、圖書所在書架的行、列.
實現思路:
摺疊法求雜湊地址 將ISBN分成位數相同的幾部分 在將他們的疊加和作為雜湊地址.疊加方法是移位疊加的。
使用鏈地址法處理衝突,即設計指標陣列,每個指標指向一個連結串列,雜湊地址為i的放入i號連結串列中。
執行結果:
首先是圖書的儲存結構定義:
typedef struct BookNode
{
char id[50]; //ISBN
char s[50]; //書名
int r,c; //圖書所在的行與列
struct BookNode *next; //指向下一本書
}BookNode;
typedef struct Book
{
BookNode *firstbook; //書庫的頭結點
}Book,*Books;
雜湊查詢 摺疊法求雜湊地址 將ISBN分成位數相同的幾部分 在將他們的疊加和作為雜湊地址.疊加方法是移位疊加的。
int Hash(char *id,int n1) { //雜湊查詢 摺疊法求雜湊地址 將ISBN分成位數相同 //的幾部分 在將他們的疊加和作為雜湊地址 int i,l,n=0,sum=0,sum1=0; l=strlen(id); for(i=l-1;i>=0;i--) { if(id[i]>='0'&&id[i]<='9') { n++; sum1=10*sum1+id[i]-'0'; } if(n==4) //每四位計算一次 { n=0; sum+=sum1; sum1=0; } } return sum%n1; }
建立書庫.
Status CreateBooks(Books &books,int n) { //建立書庫 int i,hash; BookNode *b; if(!(books=(Books)malloc(n*sizeof(Book)))) exit(OVERFLOW); for(i=0;i<n;i++) //初始化頭結點 books[i].firstbook=NULL; for(i=0;i<n;i++) { //輸入書 if(!(b=(BookNode *)malloc(sizeof(BookNode)))) exit(OVERFLOW); scanf("%s",b->id); hash=Hash(b->id,n); //鏈地址法處理衝突 scanf("%s %d %d",&b->s,&b->r,&b->c); b->next=books[hash].firstbook; books[hash].firstbook=b; } return OK; }
查詢圖書.
Status SearchBook(Books books,int n)
{
//查詢圖書
int i,q,hash;
char s[50];
BookNode *p;
scanf("%d",&q); //q次查詢
for(i=0;i<q;i++)
{
scanf("%s",s);
hash=Hash(s,n); //求雜湊地址
p=books[hash].firstbook;
while(p)
{
if(!strcmp(s,p->id)) //找到就輸出
{
printf("%s %d %d\n",p->s,p->r,p->c);
break;
}
p=p->next;
}
}
return OK;
}
銷燬書庫
Status DestroyBooks(Books &books,int n)
{
//銷燬書庫
int i;
BookNode *p,*q;
for(i=0;i<n;i++)
{
p=books[i].firstbook;
while(p)
{
q=p->next;
free(p);
p=q;
}
}
free(books);
books=NULL;
return OK;
}