Следующий код делает то, что вы хотите ... Я предполагаю, что у вас не так много инструкций. Если у вас гораздо больше инструкций, таких как Million, вы должны использовать Balanced Binary Search Tree
вместо array
. (Примечание: я использую линейный поиск, чтобы найти соответствующий ключ со средней сложностью поиска O (n) для каждого поиска).
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int *keys; // this to hold keys
char **vals; // this to hold valsues or strings
int size;
int capacity;
} Table;
Table *getTable(int capacity) {
Table *table = (Table *)malloc(sizeof(Table));
table->keys = malloc(sizeof(int) * capacity);
table->vals = malloc(sizeof(char *) * capacity);
table->size = 0;
table->capacity = capacity;
return table;
}
int insert(Table *table, int key, char *val) {
if(table->size >= table->capacity) {
// couldn't add more key/val pairs
// capacity overflowed
return 0;
}
// copy val into new dymanic char array string
int l = strlen(val);
char *buf = malloc(sizeof(char) * (l+1)); // l+1 for null char at the end
strcpy(buf, val);
table->keys[table->size] = key;
table->vals[table->size] = val;
table->size++;
return 1; // key/val pair add is successful
}
char *lookup(Table *table, int key) {
for(int i=0; i<table->size; i++) {
if(table->keys[i] == key) {
return table->vals[i];
}
}
return NULL;
}
void destroyTable(Table *table) {
for(int i=0; i<table->size; i++) {
free(table->vals[i]);
}
free(table->keys);
free(table->vals);
free(table);
}
int main() {
int capacity = 10;
Table *table = getTable(capacity);
int k1 = 12;
char *v1 = "hello";
int k2 = 19;
char *v2 = "world!";
insert(table, k1, v1);
insert(table, k2, v2);
char *val = lookup(table, k1);
printf("%d: %s\n", k1, val);
val = lookup(table, k2);
printf("%d: %s\n", k2, val);
destroyTable(table);
return 0;
}
И вывод для моего ввода был:
12: hello
19: world!
, что гарантирует правильную работу.
Также обратите внимание, что я использовал десятичное целое число. Для использования шестнадцатеричного числа вы можете сделать следующее:
int key = 0x37;
И все готово ...
[PS]: не стесняйтесь спрашивать, если что-то неясно.