The Data Structures


typedef struct symbol {
    char* name; /**< the name of the symbol */
    int   addr; /**< symbol's address in the LC3 memory */
} symbol_t;

typedef struct sym_table sym_table_t;

struct sym_table {
  int      capacity;    /**< length of hast_table array                  */
  int      size;        /**< number of symbols (may exceed capacity)     */
  node_t** hash_table;  /**< array of head of linked list for this index */
  char**   addr_table;  /**< look up symbols by addr (optional)          */
};

typedef struct node {
  struct node* next;     /**< linked list of symbols at same index */
  int          hash;     /**< hash value - makes searching faster  */
  symbol_t     symbol;   /**< the data the user is interested in   */
} node_t;

Graphical View of the Data Structures


sym_table_t
+------------+       
| capacity   |
| size       |
| hash_table | -------------> +------+
| addr_table | --+          0 | list |
+------------+   |            | list |        node_t
                 |            | list | ---> +--------+        node_t
                 |            | ...  |      | next   | ---> +--------+
                 | capacity-1 |      |      | hash   |      | next   | --> NULL
                 |            +------+      +--------+      | hash   |
                 |                          | symbol |      +--------+
                 |       "someLabel\0" <--- |   name |      | symbol |
                 |                          |   addr |  +-->|   name |
                 |                          +--------+  |   |   addr |
                 |                          +--------+  |   +--------+
                 |                                      |   +--------+
                 |                                      |
                 |                                      |
                 |                                      |
                 |                                      |
                 |                                      |
  array of char* |                                      |
    +--------+ <-+                                      |
0   |        |                                          |
    |        |                                          |
    | char*  | -----------------------------------------+
    |        |
    |        |
    |        |
    |        |
    |        | 2^16-1
    +--------+