Я изучаю структуры данных в моем университете, и я выбираю язык C. В то время как я реализовывал Hash Table, я столкнулся с некоторой ошибкой с языком C.Я новичок в C, и из того, что я знаю, язык не поддерживает выдачу ошибок, таких как throw new Exception()
в Java.Я пытаюсь создать функцию get()
, которая возвращает целочисленное значение при успешном поиске или указывает вызывающей стороне (без ошибки времени выполнения, которая вызывает сбой программы), что значение не было найдено.Мне нужно, чтобы моя таблица поддерживала полный диапазон целочисленных значений, поэтому я также не могу назначить специальное значение токена.
Я знаю, что могу заранее выполнить поиск и затем вызвать функцию get (), если поиск что-то вернулкроме NULL
, но я надеялся на более элегантное решение (один вызов функции).
Кроме того, я не решаюсь возвращать узел списка, потому что хочу сохранить реализацию HashTable как можно более абстрактной, поэтому я хочу, чтобы интерфейс Hashtable принимал только ключи и возвращал значения.(Я не хочу показывать его реализацию)
typedef int T;
typedef int Key;
typedef struct node_t {
Key key;
T val;
struct node_t *next;
struct node_t *prev;
} Node;
typedef struct {
Node *root;
Node *tail;
int size;
} List;
typedef struct {
int size;
List **elements;
} HashTable;
Node *search(List *list, T key) {
if (list == NULL) return NULL;
Node *current = list->root;
while (current != NULL && current->key != key) {
current = current->next;
}
return current;
}
T get(HashTable *table, Key key) {
unsigned int index = hash(key) % table->size;
Node *res = search(table->elements[index], key);
if (res != NULL)
return res->val;
else {
// What to do here!!!!!
}
}
Пожалуйста, предположите, что другие функции реализованы правильно, так как меня больше интересует, как решить эту проблему get()
.Большое спасибо за вашу помощь.