/* License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html
 * 
 * Exercise 4 - BST Sort (Week 5)
 * Name: Manish
 * Student Login: *****
 * 
 * Compile as:
 * $ gcc -std=c11 -Wall -o ex4 ex4.c
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int value;
    int left;
    int right;
} node;

int insert(int value, int node);
void print();

node array[100];
int root = -1;
int size = 0;
int printed = 0;

int main(void)
{
    printf("Enter file name: ");
    char filename[257];
    // Assuming filename/file path won't be longer than 256 characters
    scanf("%256s", filename);

    FILE* file = fopen(filename, "r");
    if (!file)
    {
        perror(filename);
        exit(EXIT_FAILURE);
    }

    int n;
    while (fscanf(file, " %d ", &n) != EOF && size < 100)
    {
        root = insert(n, root);
    }

    print(root);

    /* print() will print newline after every 10 numbers printed. 
     * This will print newline if needed in the end.
     */
    if (printed % 10 != 0)
        printf("\n");

    fclose(file);

    return 0;
}

int insert(int value, int node)
{
    if (node < 0)
    {
        array[size].value = value;
        array[size].left = -1;
        array[size].right = -1;
        return size++;
    }
    if (value <= array[node].value)
        array[node].left = insert(value, array[node].left);
    else
        array[node].right = insert(value, array[node].right);
    return node;
}

void print(int node)
{
    if (node < 0)
        return;
    print(array[node].left);
    printf("% 5d", array[node].value);
    if (++printed % 10 == 0)
        printf("\n");
    print(array[node].right);
}
