#include #include #include #include "streecmp.h" int strs_cnt = 0; struct nod *mknod(struct nod *prnt) { if (prnt == NULL) { return NULL; } prnt->pool_size++; prnt->pool = (struct nod *) realloc(prnt->pool, sizeof(struct nod)*prnt->pool_size); if (prnt->pool == NULL) { return NULL; } struct nod *child = &prnt->pool[prnt->pool_size-1]; child->pool_size = 0; child->pool = NULL; child->val.cval = 0; child->val.ival = 0; return child; } int mkstr(struct nod *rot, char *str) { for (int i = 0; i < rot->pool_size; i++) { struct nod *child = &rot->pool[i]; if (child->val.cval != *str) { continue; } return mkstr(child, str+1); } struct nod *new = mknod(rot); if (new == NULL) { return -1; } new->val.cval = *str; if (*str != '\0') { return mkstr(new, str+1); } strs_cnt++; new->val.ival = strs_cnt; return strs_cnt; } int gentree(struct nod *rot, char *strs) { char *strs_cpy = strdup(strs); if (strs_cpy == NULL) { return -1; } for (char *tok = strtok(strs_cpy, "\n"); tok != NULL; tok = strtok(NULL, "\n")) { int ret = mkstr(rot,tok); if (ret < 0) { return -1; } } return 0; } int streecmp(struct nod *rot, char *str) { for (int i = 0; i < rot->pool_size; i++) { struct nod *child = &rot->pool[i]; if (child->val.cval != *str) { continue; } if (child->val.cval == '\0') { return child->val.ival; } return streecmp(child, str+1); } return 0; }