Я пытаюсь создать программу, которая использует хэширование с первыми 3 символами имени, например:
Angel
took the
'Ang'
Uppercase the 3 characters
and became 'A' 'N' 'G', and % them with 65
hash keys[0][13][6]
И затем функция поиска выполняется из пользовательского ввода 3 символов, таких как
'Ang'
Uppercase it too and % with 65
and got hash key to search [0][13][16]
Таким образом, с первыми данными все в порядке, но на следующих, он печатает предыдущие данные также в таблице ha sh. Для более ясного примера:
#First search with Ang
hash keys[0][13][6] --> Angel, Angelina , Angeline
#Second search with Ang
hash keys[0][13][6] --> Angel, Angelina, Angeline, Angel, Angelina, Angeline
Я надеюсь, что этот пример имеет смысл, мое предположение состоит в том, что я допустил ошибку при первой инициализации HashT [i] [j] [k] как NULL, но я попытался напечатайте HashT [i] [j] [k] после NULL, и он правильно покажет, что он пустой. Или что-то упущено? Я надеюсь, что кто-нибудь может дать мне несколько советов или советов, которые заставляют данные накапливаться.
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
struct mhs{
long long int nim;
char name[1000];
struct mhs *next;
};
void insertToChain(char nama[], long long int nim, struct mhs **head){
struct mhs *ptr = (*head);
struct mhs *newNode = (struct mhs*)malloc(sizeof(struct mhs));
strcpy(newNode->name , nama);
newNode ->nim = nim;
newNode -> next = NULL;
if(*head == NULL){
*head = newNode;
} else{
while(ptr -> next != NULL){
ptr = ptr -> next;
}
ptr -> next = newNode;
}
}
int main(){
struct mhs *head, *node, *curr;
struct mhs *HashT[26][26][26];
long long int nim;
char name[100];
int i, j, k, size = 0;
int choice;
bool check = false;
head = curr = NULL;
do{
//Making the hash table NULL //This is the initialization to NULL
for(i = 0; i < 26; i++){
for(j = 0; j < 26; j++){
for(k = 0; k < 26; k++){
HashT[i][j][k] = NULL;
}
}
}
//Inserting data from text file into the linked list
FILE *fp;
fp = fopen("datamhs.txt", "r");
if(fp != NULL){
while(fscanf(fp, "%lld-%[^\n]", &nim, name) != EOF){
fflush(stdin);
node = (struct mhs *)malloc(sizeof(struct mhs));
node -> nim = nim;
strcpy(node->name, name);
node -> next = NULL;
if(head == NULL){
head = node;
} else {
curr = head;
while(curr -> next != NULL){
curr = curr -> next;
}
curr -> next = node;
}
size++;
}
} else {
printf("Error, no file to read\n");
}
fclose(fp);
printf("size = %d\n", size);
curr = head;
char arrayName[size][100];
i = 0;
while(curr != NULL){
strcpy(arrayName[i], curr->name);
curr = curr -> next;
i++;
}
//Uppercase them all
for(i = 0; i < size; i++){
for(j = 0; j < strlen(arrayName[i]); j++){
arrayName[i][j] = toupper(arrayName[i][j]);
}
}
// Insert data to HashTable, with input key from
// the first 3 characters and % them by 65
curr = head;
while(curr != NULL){
for(i = 0; i < size; i++){
char tempName[1000];
long long int tempNim;
strcpy(tempName, curr->name);
tempNim = curr -> nim;
insertToChain(tempName, tempNim, &HashT[arrayName[i][0] % 65] [arrayName[i][1] % 65] [arrayName[i][2] % 65]);
curr = curr -> next;
}
}
printf("===============================================\n");
printf("\t\tStudents\t\t\n");
printf("===============================================\n");
printf("(1). Search (Based on the first 3 characters)\n");
printf("(2). Delete\n");
printf("(3). Add\n");
printf("(0). Exit\n");
printf("Pilihan : "); scanf("%d", &choice); fflush(stdin);
if(choice == 1){
char key[1][2];
char oriKey[5];
printf("=================================================\n");
printf("\t\tSearch\t\t\n");
printf("=================================================\n");
printf("Enter the first 3 initials to search:\n");
scanf("%s", &key); fflush(stdin);
strcpy(oriKey, key[0]);
//to upppercase
for(j = 0; j < 3; j++){
key[0][j] = toupper(key[0][j]);
}
//Search function
i = 0;
struct mhs *ptr = HashT[key[0][0] %65] [key[0][1] % 65] [key[0][2] % 65];
printf("[%d][%d][%d] -> \n", key[0][0]%65, key[0][1] % 65, key[0][2] % 65);
if(ptr != NULL){
while(ptr != NULL){
printf("Students #%d\n", i + 1);
printf("Name : %s\n", ptr -> name);
printf("ID : %lld\n", ptr -> nim);
printf("-------------------------------------\n");
ptr = ptr -> next;
i++;
printf("\n");
}
} else{
printf("Students with initials %s not found\n", oriKey);
}
system("pause");
} else if (choice == 2){
//Delete function
}
}while(1)
И я печатаю данные с этим указателем:
struct mhs *ptr = HashT[0] [13] [6];
printf("[%d][%d][%d] -> \n", 0, 13, 6);
if(ptr != NULL){
while(ptr != NULL){
printf("Mahasiswa #%d\n", i + 1);
printf("Nama : %s\n", ptr -> name);
printf("NIM : %lld\n", ptr -> nim);
printf("-------------------------------------\n");
ptr = ptr -> next;
i++;
printf("\n");
}
} else {
print("No names found");
}