Почему эта таблица хеширования не начинается с NULL? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь создать программу, которая использует хэширование с первыми 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");
    }
...