在哈希表C中查找关键字

时间:2015-04-30 06:09:17

标签: c pointers find key hashtable

我需要帮助在我的程序中编写一个名为find的函数,它接受一个键和一个整数的引用,用适当的值(如果找到)填充引用,并返回1(true)。如果未找到密钥,则返回0(false)。您可以假设p已指向有效位置。所以:

int find( char *key, int *p );

可以像这样调用:

char *name = "Bob";
int data;
if( find( name, &data ))
   printf( "Found %s.  (S)he's %i\n\n", name, data );
else
   printf( "\nCouldn't find %s\n\n", name );

这是我的程序:

#define TABLE_SIZE  7
#define NUM_INPUTS  7

int hash( char *s )
{
   return strlen( s ) % TABLE_SIZE ;
}

typedef struct entry
{
   char *key;
   int   val;
   struct entry *next;
} entry;

entry* table[ TABLE_SIZE ] = { NULL };

void insert( char *s, int v )
{
   int h = hash( s );
   entry *t = (entry*) malloc( sizeof( entry ));

   t->key = s;
   t->val = v;
   t->next = table[h];
   table[h] = t;
}

int main()
{
   char* keyList[] = { "Jaga", "Jesse", "Cos", "Kate", "Nash", "Vera",
      "Bob" };

   int valList[] = { 24, 78, 86, 28, 11, 99, 38 };

   int i;

   for( i=0; i<NUM_INPUTS; ++i )
      insert( keyList[i], valList[i] );

  /* Probably call function find right here */

   return( 0 );
}

int find( char *key, int *p_ans )
{
}

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您需要编写一个keycomp函数原型

int keycomp (struct data left,struct data right);

返回0表示等于,-1表示L> R,1表示R> L。

通过将测试密钥与存储的密钥进行比较,从数据空间链中的原点开始。

因为你有很多我控制,即知道什么时候发生碰撞。 您可以尝试存储测试密钥,如果它直接进入您知道测试密钥没有存储值。如果它发生碰撞,你需要对所有碰撞键做一个keycomp。注意键{2,rhubarb}可能与{37,dog}具有相同的哈希值。

请记住删除这个新创建的虚拟测试记录。