unsigned count;
};
-/* Lookup leaf prototype */
+/* Lookup leaf function prototype */
struct leaf *lookupLeaf(void **, const char *, unsigned);
+/* Freeing node function prototype */
+void freeTree(void *, unsigned);
+
/* Main function */
int main(int argc, char **argv) {
/* Read until end of file */
} while (ret != 0);
+ /* Free tree */
+ freeTree(tree, 0);
+
/* Close file */
if (close(fd) == -1) {
perror("Close failed");
exit(EXIT_SUCCESS);
}
+/* Recursive freeing of node function */
+void freeTree(void *base, unsigned index) {
+ void *current = base, *next;
+ if (base != NULL) {
+ /* Branch level */
+ if (index < 8) {
+ /* Free horizontaly */
+ do {
+ /* Free children */
+ if (((struct branch *)current)->child != NULL) {
+ freeTree(((struct branch *)current)->child, index + 1);
+ }
+ /* Free current and switch to next */
+ next = ((struct branch *)current)->next;
+ free(current);
+ current = next;
+ } while (current != NULL);
+ /* Leaf level */
+ } else {
+ /* Free horizontaly */
+ do {
+ /* Free current and switch to next */
+ next = ((struct leaf *)current)->next;
+ free(current);
+ current = next;
+ } while (current != NULL);
+ }
+ }
+}
+
/* Recursive lookup and populate tree function */
struct leaf *lookupLeaf(void **base, const char *key, unsigned index) {
/* Return leaf */
if (*base == NULL) {
/* Branch level */
if (index < 8) {
- *base = malloc(sizeof(struct branch));
+ if ((*base = malloc(sizeof(struct branch))) == NULL) {
+ perror("Malloc failed");
+ exit(EXIT_FAILURE);
+ }
((struct branch *)*base)->key = key[index] - ZERO_OFFSET;
((struct branch *)*base)->next = NULL;
((struct branch *)*base)->child = NULL;
ret = lookupLeaf(&(((struct branch *)*base)->child), key, index + 1);
/* Leaf level */
} else {
- *base = malloc(sizeof(struct leaf));
+ if ((*base = malloc(sizeof(struct leaf))) == NULL) {
+ perror("Malloc failed");
+ exit(EXIT_FAILURE);
+ }
((struct leaf *)*base)->key = key[index] - ZERO_OFFSET;
((struct leaf *)*base)->next = NULL;
((struct leaf *)*base)->count = 0;
/* Backup current in prev */
prev = current;
/* Create new branch with key */
- current = malloc(sizeof(struct branch));
+ if ((current = malloc(sizeof(struct branch))) == NULL) {
+ perror("Malloc failed");
+ exit(EXIT_FAILURE);
+ }
((struct branch *)current)->key = key[index] - ZERO_OFFSET;
((struct branch *)current)->next = NULL;
((struct branch *)current)->child = NULL;
/* Backup current in prev */
prev = current;
/* Create new leaf with key */
- current = malloc(sizeof(struct leaf));
+ if ((current = malloc(sizeof(struct leaf))) == NULL) {
+ perror("Malloc failed");
+ exit(EXIT_FAILURE);
+ }
((struct leaf *)current)->key = key[index] - ZERO_OFFSET;
((struct leaf *)current)->next = NULL;
((struct leaf *)current)->count = 0;