我创建了哈希表来插入我的值。但是当我插入多个值时,我在所有字段中都获得了相同的值。我的代码在这里:
为用户和哈希表创建一个结构
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函数在结构中插入更多的用户名和密码时,我在两个字段中都得到了相同的值。这是新的一个覆盖前一个并显示两个值作为新用户名。为什么?我的代码有问题吗?
答案 0 :(得分: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
。
如果要为username
结构的password
和UserNode
成员分配固定大小,为什么不将它们作为数组呢?像
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);
}