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

why i get same values inside hash table?

我创建了散列 table 来插入我的值。但是当我插入多个值时,我在所有字段中得到相同的值。我的代码在这里:

为用户和散列创建一个结构table

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

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

// 将散列 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;

       }

将每个用户名插入哈希 table

      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;
    }

这个函数显示散列table

    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);

    }
    }

我从主函数中调用这些函数:

.......主要代码...... ................................... 案例 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(),

 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);
}

两件事:

  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. 的指针
  3. 如果要为 UserNode 结构的 usernamepassword 成员分配固定大小,为什么不将它们设为数组?喜欢

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

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