Хеширование (с помощью цепочек) базы данных ученика (складывание битов / аддитивное хеширование) - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь хэшировать базу данных студентов на основе их идентификатора (вся их информация читается через текстовый файл).Я должен использовать хеш-функцию по модулю суммы ASCII-кода каждого символа в ID, разделенную на нечетное число, представляющее число хеш-кодов.

Например, еслиID ученика: AE797989 и m = 11:

Хэш (AE797989) = [ASCII ('A') + ASCII ('E') + ASCII ('7') + ASCII ('9') + ASCII('7') + ASCII ('9') + ASCII ('8') + ASCII ('9')] mod m.

Мой текстовый файл состоит из 19 студентов и выглядит примерно так:

AE797989 Смит Джон 19.00 UE354567 Уолш Одри 12.00 ... (он содержит их идентификационный номер, фамилию, имя и класс)

В моем основном, у меня есть выбор, где пользователь может выбрать:заполните базу со студентами в моем текстовом файле.В этом случае я вызываю свою функцию (расположенную вне моего основного): void insertToHash, где я открываю свой файл, и пытаюсь создать контейнер для каждого студента, вызывая функцию, которую я специально создал для хэширования;называется int * Hash.

Я нашел код для хэш-функции, о которой я упоминал, написанной на Java, но, поскольку строки воспринимаются по-разному в C, я получаю предупреждения при компиляции.Код, который я нашел:

    int h(String x, int M) {
   char ch[];
   ch = x.toCharArray();
   int xlength = x.length();

   int i, sum;
   for (sum=0, i=0; i < x.length(); i++)
     sum += ch[i];
   return sum % M;
 }

И вот функции, которые я упомянул:

struct hash *hashTable = NULL;

struct node 
{
float grade;
char AM[100];
char first_name[100];
char last_name[100];
struct node *next;
}node;

struct hash 
{
struct node *head;
int count;
};

struct node * createNode(char *AM, char *first_name, char *last_name, float grade) 
{
struct node *newnode;

newnode = (struct node *) malloc(sizeof(struct node));
strcpy(newnode->AM, AM);
newnode->grade = grade;
strcpy(newnode->first_name, first_name);
strcpy(newnode->last_name, last_name);
newnode->next = NULL;
return newnode;
}

int* Hash(char **AM, int n)
{    
int i;
char* hashNum=0;

  for (i=0; i< 8; i++)
  {
  char *am = AM[i];
  hashNum += am;
  }

  int hashIndex = atoi(hashNum);
  return hashIndex % n;
}

void insertToHash(char *AM, char *first_name, char *last_name, float grade) 
{
FILE *fp;
fp = fopen ("Foitites-Vathmologio-DS.txt","rb");
if (fp == NULL) 
                { 
                fprintf(stderr,"Could not open file");  
                return;
                } 

while(fscanf(fp,"%s %s %s %d",node.AM, node.first_name, node.last_name, &node.grade) != EOF)
{   
int hashIndex = Hash(*AM, 19);

struct node *newnode = createNode(AM, first_name, last_name, grade);
/* head of list for the bucket with index "hashIndex" */

if (!hashTable[hashIndex].head) 
{
hashTable[hashIndex].head = newnode;
hashTable[hashIndex].count = 1;
return;
}

/* adding new node to the list */
newnode->next = (hashTable[hashIndex].head);
/*
* update the head of the list and no of
* nodes in the current bucket
*/
hashTable[hashIndex].head = newnode;
hashTable[hashIndex].count++;}
fclose(fp);
return;
}

Для моей функции Hash (char ** AM, int n) я получаю предупреждение:аргумент 1 'Hash' делает указатель из целого числа без приведения (на самом деле я получаю это предупреждение много раз, и я пытался исправить его, но продолжаю ухудшать его)

Для моей строки: hashNum + = am;Я получаю сообщение об ошибке: недопустимые операнды для двоичного кода (+ есть 'char *' и 'char *')

Я потерян и буду очень признателен за помощь, спасибо!

1 Ответ

1 голос
/ 20 мая 2019

Ну, ваши типы не правы.

Здесь

int* Hash(char **AM, int n) 

вы говорите, что функция должна возвращать указатель на целое число . Однако функция возвращает целое число.

Далее вы говорите, что функция ожидает указатель на указатель на символ (и int). Однако, когда вы называете это как

int hashIndex = Hash(*AM, 19); 

Вы передаете символ (и int).

Я ожидаю, что ваша функция будет больше похожа на:

int Hash(char *AM, int n)
{    
  int i;
  int hashIndex = 0;

  for (i=0; i< 8; i++)
  {
    hashIndex += AM[i];
  }

  return hashIndex % n;
}

и называться как:

int hashIndex = Hash(AM, 19); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...