为什么我在哈希 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);
}
两件事:
您有密码:
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
.
的指针
如果要为 UserNode
结构的 username
和 password
成员分配固定大小,为什么不将它们设为数组?喜欢
struct UserNode
{
char username[20];
char password[20];
};
顺便说一句,这也解决了第一个问题,因为您不再需要分配内存。它还将减少内存碎片。
我创建了散列 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);
}
两件事:
您有密码:
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
. 的指针
如果要为
UserNode
结构的username
和password
成员分配固定大小,为什么不将它们设为数组?喜欢struct UserNode { char username[20]; char password[20]; };
顺便说一句,这也解决了第一个问题,因为您不再需要分配内存。它还将减少内存碎片。