为什么我在哈希表中得到相同的值?

时间:2015-05-01 09:18:20

标签: c hash structure dynamic-memory-allocation

我创建了哈希表来插入我的值。但是当我插入多个值时,我在所有字段中都获得了相同的值。我的代码在这里:

为用户和哈希表创建一个结构

 struct UserNode
    {
    char *username;
    char *password;
    };

    struct HashTable
    {
        int size;
        struct UserNode *table;
    };

//将哈希表初始化为NULL

      struct HashTable* initializeTable(int size)
       {

        struct HashTable *htable;
        int i = 0;
        if (size < MIN_TABLE_SIZE)
        {
                printf("Table Size Too Small\n");
                return NULL;
        }

        htable = malloc(sizeof(struct HashTable));

        if (htable == NULL)
        {
                printf("Out of Space\n");
                return NULL;
        }

        htable->size = size;

        htable->table = malloc(size * sizeof(struct UserNode));

        if (htable->table == NULL)
        {
                printf("Table Size Too Small\n");
                return NULL;
        }

        for (i = 0; i < htable->size; i++)
        {
                htable->table[i].username= malloc(20 * sizeof(char));
                htable->table[i].password = malloc(20 * sizeof(char));
                htable->table[i].username=NULL;
                htable->table[i].password=NULL;
        }

        printf("Hsh table sucessfully created\n");
        return htable;

       }

将每个用户名插入哈希表

      int Insert(char *key,char *password,struct HashTable *htable)
     {
      int pos = 0;

      pos = Find(key,htable);
      printf("the value of key : %d\n",pos);
      if ((htable)->table[pos].username == NULL)
      {
        (htable)->table[pos].username,key ;
        (htable)->table[pos].password = password;
      }

      else
      {
                printf("Duplicate element ..\n");
      }
        return 0;
    }

此函数显示哈希表

    void Retrieve(struct HashTable *htable)
     {

        int i=0;

     for (i = 0; i < htable->size; i++)
     {
        if (htable->table[i].username == NULL)

            printf("Position: %d \tusername : NULL\tpassword: NULL\n",i + 1);

        else

            printf("Position: %d \t username: %s\tpassword: %s\n",i + 1,htable->table[i].username,htable->table[i].password);

    }
    }

我从main函数调用这些函数:

............主要代码............      ...............................      案例1:

    printf("Enter size of the Hash Table:\n");
    scanf("%d",&size);
    htable = initializeTable(size);

   break;
   case 2:

    if (i > htable->size)

    {
        printf("Table is Full, Rehash the table\n");

        continue;
    }
         printf("Enter the username:\n");
         scanf("%s",&username);
         printf("Ebter the password:\n");
         scanf("%s",&password);
         Insert(username,password,htable);
         i++;

    break;


 case 3:
        printf("Display\n");
        Retrieve(htable);

    break;

但是当我通过insert函数在结构中插入更多的用户名和密码时,我在两个字段中都得到了相同的值。这是新的一个覆盖前一个并显示两个值作为新用户名。为什么?我的代码有问题吗?

2 个答案:

答案 0 :(得分:1)

两件事:

  1. 您有代码:

    htable->table[i].username= malloc(20 * sizeof(char));
    htable->table[i].password = malloc(20 * sizeof(char));
    htable->table[i].username=NULL;
    htable->table[i].password=NULL;
    

    首先你分配内存,然后立即用NULL覆盖指针,使你松开你刚分配的内存,导致泄漏,如果你使用指针,可能undefined behavior(和可能的崩溃)没有检查NULL

  2. 如果要为username结构的passwordUserNode成员分配固定大小,为什么不将它们作为数组呢?像

    struct UserNode
    {
        char username[20];
        char password[20];
    };
    

    顺便说一句,这也将解决第一个问题,因为您不再需要分配内存。它还可以减少内存碎片。

答案 1 :(得分:0)

Insert()

 if ((htable)->table[pos].username == NULL)
  {
    (htable)->table[pos].username,key ;
    (htable)->table[pos].password = password;

(htable)->table[pos].username,key;行没有做任何事情。此外,字符串应通过strcpy()strncpy()复制,而不是通过指针赋值。

所以它应该是:

if (htable->table[pos].username == NULL)
{
    htable->table[pos].username = malloc(strlen(key) + 1);
    strcpy(htable->table[pos].username, key);
    htable->table[pos].password = malloc(strlen(password) + 1);
    strcpy(htable->table[pos].password, password);
}