我已经创建了一个哈希表,我在其中插入了一些东西,但出于某种原因, 当我从桌子上打印时,我把东西放在桌子上,她打错了。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
typedef struct hash Hash;
typedef struct utilizador{
char nick[6];
char nome[26];
}
struct hash{
int quantidade, table_size;
utilizador **itens;}
Hash* criateHash(int table_size){
Hash* ha= (Hash*)malloc(sizeof(Hash));
if(ha!=NULL) {
int i;
ha->table_size = table_size;
ha->itens = (utilizador **) malloc(table_size * sizeof(utilizador *));
}
if(ha->itens==NULL) {
free(ha);
return NULL;
}
ha->quantidade=0;
for(int i=0; i< ha->table_size; i++){
ha->itens[i]=NULL;
}
return ha;
}
int string_value(char *string){
int i, valor=0;
int tam= strlen(string);
for(i=0; i< tam; i++){
valor= pow(31,tam-1 )* (int) string[i]+valor;
}
return valor;
}
int hash_function(int chave, int table_size, Hash *ha){
int position=(chave%table_size);
if (ha->itens[position]==NULL)
return position;
else {
for (int j = 0; j < table_size; j++) {
position = position + j;
if(position>table_size)
return -1;
else if (ha->itens[position] == NULL) {
return position;
}
}
return -1;
}
}
int insereHash(Hash* ha, utilizador *a, int table_size){
int i, check, chave;
check=searchHash(ha, a, table_size);
if(check==-1) {
chave=string_value(a[0].nick);
i = hash_function(chave, table_size, ha);
if (i != -1) {
ha->itens[i] = a;
ha->itens[i]->activo=true;
printf("%d %d ",check, i);
printf("+ utilizador %s criado\n",ha->itens[i]->nick );
} else if (i==-1)
printf("hash não tem espaço");
}else if (check!=-1){
printf("%d", check);
printf("+ nick %s usado previamente\n", a[0].nick);
}
}
int searchHash(Hash* ha, utilizador *a, int table_size){
int chave=string_value(a[0].nick);
int position=(chave%table_size);
if(ha->itens[position]->nick!=NULL) {
if (str_compare(ha->itens[position]->nick, a[0].nick) == 0)
return position;
else {
for (int j = 0; j < table_size; j++) {
position = position + j;
if (position > table_size)
return -1;
else if(ha->itens[position]->nick==NULL)
j++;
else if (str_compare(ha->itens[position]->nick, a[0].nick) == 0) {
return position;
}
}
}
}
return -1;
}
void input(utilizador *a, char *comando, char *aux) {
fgets(aux, 35, stdin);
sscanf(aux, "%s %s %99[^\n] ", comando, &a[0].nick, &a[0].nome);
}
int str_compare( char *string1, char *string2){
for(int i=0;i<5;i++) {
if (string1[i] != string2[i]) {
return 1;
}
}return 0;
}
int table_size=23;
utilizador ar_temp[1];
char comando[2];
char aux[35];
int pos;
Hash *ha;
int main() {
ha = criateHash(table_size);
while((strcmp (comando, "X"))!=0 && (strcmp (comando, "x")!=0)) {
input(ar_temp, comando, aux);
if ((strcmp (comando, "U")==0)) {
insereHash(ha, ar_temp, table_size);
}
}
for(int g=0; g<table_size; g++){
printf("%s ",ha->itens[g]->nick);
}
return 0;
}
我使用的输入是: U asdre ana U qwert joa U qwert pedro U hjklm gomes U ertyu ana U hhudr humberto U e5sxs wis U 2kkji toba U p07hm rojao U zxcvb tutu X
我的输出是:
-1 19 + utilizador asdre criado
-1 22 + utilizador qwert criado
22+ nick qwert usado previamente
-1 10 + utilizador hjklm criado
-1 11 + utilizador ertyu criado
-1 20 + utilizador hhudr criado
19+ nick e5sxs usado previamente
-1 7 + utilizador 2kkji criado
-1 5 + utilizador p07hm criado
10+ nick zxcvb usado previamente
10+ nick zxcvb usado previamente
(null) (null) (null) (null) (null) zxcvb (null) zxcvb (null) (null) zxcvb zxcvb (null) (null) (null) (null) (null)
(null) (null) zxcvb zxcvb (null) zxcvb
Process finished with exit code 0
我的问题是:为什么我之前在表中插入的其他值不存在,我该如何解决这个问题? 你能救我吗?
答案 0 :(得分:0)
您的哈希表存储指向“struct utilizador”实例的指针。但是,每次调用insereHash
时,您都会传递相同的ar_temp
实例,在每次调用input
时都会覆盖该实例。
这就是为什么你最后多次打印相同的字符串 - 条目在正确的位置,但你覆盖了数据。
你想:
ha->itens: [.| |.|.| ]
| | |
| | +-> {"asdre","ana"}
| +---> {"qwert","joa"}
+-------> {"zxcvb","tutu"}
你有:
ha->itens: [.| |.|.| ]
| | |
+---+-+-> {"zxcvb","tutu"} <-- ar_temp