Я пытаюсь хэшировать базу данных студентов на основе их идентификатора (вся их информация читается через текстовый файл).Я должен использовать хеш-функцию по модулю суммы 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 *')
Я потерян и буду очень признателен за помощь, спасибо!