Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Return an array of size *returnSize.
- * Note: The returned array must be malloced, assume caller calls free().
- */
- typedef struct Tree {
- char *domain;
- int visit;
- Tree **children;
- } Tree;
- void flattenTree (Tree **tree, int *idx, char **result) {
- int i;
- for (i = 0; tree[i] != NULL; i++) {
- result[idx] = ()
- }
- }
- char** subdomainVisits(char** cpdomains, int cpdomainsSize, int* returnSize) {
- int count = 0;
- Tree **tree = (Tree **) malloc(sizeof(Tree *) * 300);
- memset(tree, 0, 300);
- int i, j, k;
- for (i = 0; i < cpdomainsSize; i++) {
- // map visit & domain name
- int visit;
- char *domain = (char *) malloc(sizeof(char) * 100);
- memset(domain, 0, 100);
- sscanf(cpdomains[i], "%d %s", &visit, domain);
- // divide domain into 3 parts
- char **parts = (char **) malloc(sizeof(char *) * 3);
- char *token = strtok(domain, ".");
- int total = 0;
- while(token) {
- parts[total] = (char *) malloc(size(char) * 100);
- strcpy(parts[total], token);
- token = strtok(NULL, ".");
- total++;
- }
- // start from the last part
- Tree **current = tree;
- for (j = total - 1; j >= 0; j--) {
- int found = 0;
- for (k = 0; current[k] != NULL; k++) {
- // if domain matches, add counter and transverse to it's children
- // create children if doesn't exist
- if (strcmp(current[k]->domain, parts[j]) == 0) {
- found = 1;
- current[k]->visit += visit;
- current = current[k]->children;
- break;
- }
- }
- // if not found, append current domain to the tree
- if (!found) {
- current[k] = (Tree *) malloc(sizeof(Tree));
- current[k]->domain = parts[j];
- current[k]->visit = visit;
- current[k]->children = (Tree **) malloc(sizeof(Tree) * 300);
- current = current[k]->children;
- memset(current[k]->children, 0, 300);
- }
- }
- }
- char **result = (char **) malloc(sizeof(char) * 300);
- }
Advertisement
Add Comment
Please, Sign In to add comment