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); | 
