1
衝突したキーのリンクに問題があります。最新のキーは、テーブルにリンクされた前のキーよりも優先されます。私は、衝突したキーがリンクされたリストに正しく保存されているかどうかを確認するために、衝突のためにコード化されていますが、正しく保存されていません。 コードに含まれる部分は次のとおりです。 while(tempHash!= NULL)
ループ後にヌルにハッシュテーブル内の次への衝突キーのハッシュ
typedef struct student
{
char name[10];
char sex[4];
char number[12];
char mail[50];
bool filled;
struct student *next;
}ST;
void Readfromfile(ST *hashTable)//Read data from txt file and build hash table
{
FILE *ft;
ft = fopen("info.txt", "r");
if(!ft)
{
printf("FAILED TO OPEN FILE\n");
return;
}
char *buffer = malloc(sizeof(char)*43);
char cp_name[10], cp_sex[4], cp_num[12], cp_mail[50];
int st_index =0, i;
while((fgets(buffer, sizeof(buffer)*50, ft)) != NULL)
{
if(strlen(buffer) != 0)
sscanf(buffer, "%s %s %s %s", cp_name, cp_sex, cp_num, cp_mail);
printf("READ: %s", buffer);
int hash_value = Hashfun(cp_num);
ST *current = malloc(sizeof(ST));
strcpy(current->name, cp_name);
strcpy(current->sex, cp_sex);
strcpy(current->number, cp_num);
strcpy(current->mail, cp_mail);
current->filled = true;
current->next = NULL;
ST *tempHash = &hashTable[hash_value];
if(tempHash->filled == true)
{
printf("THERE IS A COLLISION at %d SAVING AT NEXT \n\n\n",hash_value);
while(tempHash!= NULL)
{
printf("I AM PROBLEM HEREEEEEEEEEEEEEEEEEEEEEEE\n");
printf("PASSING BY: %s %s %s %s at %d\n",tempHash->name,tempHash->sex,
tempHash->number,tempHash->mail, hash_value);
tempHash = tempHash->next;
}
tempHash = current;
printf("HASHED NEXT: %s %s %s %s at %d\n",tempHash->name,tempHash->sex, tempHash->number,
tempHash->mail, hash_value);
}
else
{
strcpy(tempHash->name, cp_name);
strcpy(tempHash->sex, cp_sex);
strcpy(tempHash->mail, cp_mail);
strcpy(tempHash->number, cp_num);
tempHash->filled = true;
tempHash->next = NULL;
printf("HASHED: %s %s %s %s at %d\n",tempHash->name,tempHash->sex, tempHash->number,
tempHash->mail, hash_value);
}
}
}
コードのインデントを適切に行うと、問題の詳細がわかります。 –
問題は衝突を次のものにリンクしていました。以下の答えはそれを解決しました。そして、すべてがうまくインデントされ、ちょうどコピー中に台無しになった!しかし、ありがとう。 @ 200OK –