3

リンクリストチェーン方式を使用してCでハッシュテーブルを実装しています。プログラムは実行されますが、エントリを検索している間"Element is not found"、要素がハッシュにあるにもかかわらず、常に結果が得られます。この投稿は、私の前の投稿を少し編集したものです。プログラムは以下のとおりです。

struct llist{
   char *s;
   struct llist *next;
};

struct llist *a[100];

void hinsert(char *str){
   int strint, hashinp;
   strint = 0;
   hashinp = 0;
   while(*str){
      strint = strint+(*str);
      str=str+1;
   }
   hashinp = (strint%100);
   if(a[hashinp] == NULL){
      struct llist *node;
      node = (struct llist *)malloc(sizeof(struct llist));
      node->s = str;
      node->next = NULL;
      a[hashinp] = node;
   }
   else{
      struct llist *node, *ptr;
      node = (struct llist *)malloc(sizeof(struct llist));
      node->s = str;
      node->next = NULL;
      ptr = a[hashinp];
      while(ptr->next != NULL){
         ptr = ptr->next;
      }
      ptr->next = node;
   }
}  

void hsearch(char *strsrch){
   int strint1, hashinp1;
   strint1 = 0;
   hashinp1 = 0;
   while(*strsrch){
      strint1 = strint1+(*strsrch);
      strsrch = strsrch+1;
   }
   hashinp1 = (strint1%100);
   struct llist *ptr1;
   ptr1 = a[hashinp1];
   while(ptr1 != NULL){
      if(ptr1->s == strsrch){
         cout << "Element Found\n";
         break;
      }else{
         ptr1 = ptr1->next;
      }
   }
   if(ptr1 == NULL){
      cout << "Element Not Found\n";
   }
}  

hinsert()ハッシュに要素を挿入することhsearchであり、ハッシュ内の要素を検索することです。ハッシュ関数はhinsert()それ自体の中に書かれています。でmain()、私がすべての要素を次のように初期化していa[]ますNULL

for(int i = 0;i < 100; i++){
   a[i] = NULL;
}
4

2 に答える 2

3

あなたのプログラムは無限ループにありますか?おそらくこの行で?

while(*str){
        strint = strint+(*str);
}

そのループのスコープでへのポインタ*strが無効になることはないため、無限ループが発生するはずです。

于 2012-10-31T16:57:41.590 に答える
3

このループではポインタを進めていません。(これも本当に悪いハッシュ関数です)

while(*str){
        strint = strint+(*str);
}
于 2012-10-31T16:58:10.643 に答える