Add WordTree data structure and helper functions

This commit is contained in:
2023-03-28 19:05:08 -04:00
parent 82991e96e7
commit 6f4d4a69a0
2 changed files with 87 additions and 0 deletions
+12
View File
@@ -3,6 +3,7 @@
#include <string.h>
#include <ctype.h>
#include "board.h"
#include "tree.h"
int main(int argc, char **argv) {
const uint8_t BOARD_SIZE = 4;
@@ -17,9 +18,20 @@ int main(int argc, char **argv) {
struct BoardCell **cells = malloc(sizeof(struct BoardCell*) * BOARD_SIZE * BOARD_SIZE);
for (uint8_t i = 0; i < BOARD_SIZE * BOARD_SIZE; i++) {
cells[i] = create_board_cell(letters[i], (int)(i / BOARD_SIZE), i % BOARD_SIZE);
print_boardcell(cells[i]);
}
Board board = { .height = 4, .width = 4, .cells = cells };
print_board(&board);
free(cell_letters);
struct WordNode *root = malloc(sizeof(struct WordNode));
init_wordnode(root, false, cells[0], NULL, NULL, 0);
print_wordnode(root);
add_child_node(root, cells[5], false);
//add_child_node(root->children[0], cells[6], false);
print_wordnode(root);
print_wordnode_path(root->children[0]);
free(root);
}
+75
View File
@@ -0,0 +1,75 @@
#ifndef WORD_TREE
#define WORD_TREE
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "board.h"
struct WordNode {
bool is_word;
struct BoardCell *cell;
struct WordNode *parent;
uint8_t child_cnt;
struct WordNode *children[];
};
struct WordTree {
char *alphabet;
struct WordNode *root;
};
void print_wordnode(struct WordNode *n) {
printf("%3s | (%d,%d) | %3d\n", n->cell->letters, n->cell->row, n->cell->col, n->child_cnt);
}
void *print_wordnode_path(struct WordNode *n) {
if (n == NULL) {
return NULL;
}
struct WordNode *node = n;
// Print letters from leaf to root
do {
printf("%s < ", node->cell->letters);
node = node->parent;
} while(node != NULL);
puts("ROOT");
return node;
}
void *init_wordnode(struct WordNode *n, bool is_word, struct BoardCell *cell,
struct WordNode *parent, struct WordNode *children[], uint8_t child_cnt) {
n->is_word = is_word;
n->cell = cell;
n->parent = parent;
if (children != NULL) {
for (uint8_t i = 0; i < child_cnt; i++) {
n->children[i] = children[i];
}
}
n->child_cnt = child_cnt;
return n;
}
struct WordNode *add_child_node(struct WordNode *parent, struct BoardCell *cell, bool is_word) {
parent = realloc(parent, sizeof(struct WordNode) + sizeof(struct WordNode*));
parent->children[parent->child_cnt] = malloc(sizeof(struct WordNode));
init_wordnode(parent->children[parent->child_cnt], is_word, cell, parent, NULL, 0);
parent->child_cnt++;
return parent->children[parent->child_cnt];
}
void *insert_word(struct WordTree *tree, char *word) {
// TODO: Traverse tree from tree->root and add nodes needed to complete `word`
return NULL;
}
int search(struct WordTree *tree, char *word) {
// TODO: Traverse `tree` node-by-node and return an array of Board paths for `word`
return 0;
}
#endif /* WORD_TREE */