diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | main.c | 9 | ||||
-rw-r--r-- | tree.c | 60 | ||||
-rw-r--r-- | tree.h | 18 |
5 files changed, 77 insertions, 13 deletions
@@ -1 +1,2 @@ bin/ +a.out @@ -12,7 +12,7 @@ EXES := $(ARCFIND) CFLAGS := $(addprefix -I,$(SRCDIRS)) $(XTRAFLAGS) LDLIBS := -ARCFIND_O := $(addprefix ./bin/, main.o) +ARCFIND_O := $(addprefix ./bin/, main.o, tree.o) all: $(EXES) .PHONY: all @@ -1,6 +1,9 @@ #include <stdio.h> +#include "tree.h" -int main(void) { - printf("arcfind!\n"); - return 0; +int main(){ + char str[100]; + printf("type in your tree(no spaces please): "); + scanf("%[^\n]", str); + printTree(parse(str),0); } @@ -0,0 +1,60 @@ +#include <stdio.h> +#include <stdlib.h> +#include "tree.h" + +int strichar(const char *str, char c){ + for(int i=0; str[i]!='\0';i++){ + if(str[i] == c) return i; + } + return -1; //char not found +} +const char ops[] = {'+','*','!'}; //ordem inversa +const int opsize = sizeof(ops)/sizeof(char); +node * parse(char *str) { //expects a string with no whitespace + + int j,i; + for(i=0; i<opsize; i++){ + j=strichar(str,ops[i]); + if(j>=0) break; + } + + node *this = (node *)malloc(sizeof(node)); + + if(j<0) { + this->type = LTTR; + this->el = str[0]; + } + + else{ + this->el = ops[i]; + if(i==2) { + this->type = UNOP; + this->child[0] = parse(str+j+1); + } + else { + str[j] = '\0'; + this->type = BIOP; + this->child[0] = parse(str); + this->child[1] = parse(str+j+1); + } + } + return this; +} + +void printTree(node *root, int level) { + if (root == NULL) + return; + + if (level) { + for (int i = 1; i < level; i++) { + printf("│ "); + } + printf("├─ "); + } + printf("%c\n", root->el); + for (int i = 0; i < 2; i++) { + if (root->child[i] != NULL) { + printTree(root->child[i], level + 1); + } + } +} @@ -1,13 +1,13 @@ enum nodeType { - BIOP, - UNOP, - LTTR + BIOP, + UNOP, + LTTR }; -typedef struct { - enum nodeType type; - char el; - struct node *child[2]; +typedef struct node { + enum nodeType type; + char el; + struct node *child[2]; } node; - -node* parse(const char *str); +node * parse(char *str); +void printTree(node *root, int level); |