C中哈希表插入函数的问题

时间:2010-01-31 19:18:30

标签: c pointers hashtable

我正试图立即绕过C(主要是指针如何操作)。我正在尝试编写下面描述的这个函数:

/ * EnterName在符号表中输入名称。返回一个                   boolean指示Name的条目是否为                   已列在表中。传回一个论点                    包含名称的条目引用。

无论如何,这是我写的代码,我不知道如何测试它。想知道是否有人可以查看它并让我知道我是否正确行事。

提前致谢。

代码::

bool EnterName(struct SymTab *ATable,
              const char *Name,
              struct SymEntry * *AnEntry)
{
              char name = *Name;
              unsigned hashval = hash (&name);
              struct SymEntry *ptr;

          ptr = ATable->Contents[hashval];

          while(ptr != NULL)
          {
                    if(strcmp(ptr->Name, &name)) 
                    {
                                 AnEntry = &ptr;
                                 return true;
                    } 
          }

          ptr = malloc(sizeof(struct SymEntry));
          ptr->Name = &name;
          AnEntry = &ptr;
          return false;

}

4 个答案:

答案 0 :(得分:3)

它是否会运行并产生您期望的结果?

在学习新语言时,无法替代编译代码,使用测试数据运行代码,将结果与预期值进行比较,调试等。向他人展示未经测试的代码并询问是否正确是不正确的方法。

即使是函数的前两行也没有意义:

   char name = *Name;
   unsigned hashval = hash(&name);

您刚刚将Name的第一个字符带入name变量,然后尝试哈希其地址。

现在,循环:

          while(ptr != NULL)
          {
                    if(strcmp(ptr->Name, &name)) 
                    {
                                 AnEntry = &ptr;
                                 return true;
                    } 
          }

也没有意义,因为你没有在任何地方推进ptr - 这是一个无限循环。

也就是说,代码中似乎朝着正确的方向迈出了一步。你必须让你的类型笔直,并修复所有粗糙的角落。我建议从小块开始 - 看它们编译并运行,然后继续组装成更大的块。

答案 1 :(得分:0)

我至少可以发现一个错误。你只是哈希每个名字的第一个字母......
name =单个chatacter(副本) hash(& name),散列单个字符的副本。 你想要一个带有大写的散列(Name),这样你就可以给sting开始哈希,所以它可以散列整个东西。

答案 2 :(得分:0)

char name = *Name;

这将使用Name的第一个字符并将其存储在name中(字符串Hello将被截断为单个H)。您当然希望namechar*(指向字符数组的指针)而不是单个字符。

如果匹配b,则

strcmp(a,b)返回0。我认为应该是

if(!strcmp(ptr->Name, name)) 

此外,您的循环可能会永远运行。如果第一次比较失败(假设您添加!),循环将永远继续,因为ptr的值永远不会改变。

你的代码有很多错误。你必须测试它。拿一个编译器,编译它,运行它。没有测试的编程是不可能的。

答案 3 :(得分:0)

AnEntry = &ptr;

没有做你想做的事。它正在更改 local 变量AnEntry的值而不更改调用例程中的值。

你想要

*AnEntry = ptr;

还有其他一些错误,也可能是错误,但是其他人似乎已经很好地覆盖了这些错误......