1. 程式人生 > >雜湊查詢-圖書館查詢

雜湊查詢-圖書館查詢

下面用雜湊查詢來解決一個實際問題:圖書館查詢問題。

圖書館裡面有若干本書(至少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;
}