The aim of this puzzle, is to build a radix tree or PATRICIA tree, to represent a set of telephone numbers. Once the data structure declared, you just have to go along the branch of the tree corresponding to each new number, adding missing nodes.
#include <stdlib.h> #include <stdio.h> #include <string.h> struct item { int digit; int nbChildren; struct item* children[10]; }; // Returns a new item which has the digit 'd' struct item *newItem(int d) { struct item *it = malloc(sizeof(*it)); it->digit = d; it->nbChildren = 0; return it; } // If it exits, returns a pointer toward the child of item 'f' // which has the digit 'digit', else returns NULL struct item *getChild(struct item *f, int d) { for (int i = 0; i < f->nbChildren ;i++) if (f->children[i]->digit == d) return f->children[i]; return NULL; } // Add a child which has the digit 'digit' to item 'father' void addChild(struct item *f, int d) { struct item *child = newItem(d); f->children[f->nbChildren] = child; f->nbChildren++; } // Frees an item and its children recursively void freeItem(struct item *it) { for (int i = 0; i < it->nbChildren; i++) free(it->children[i]); free(it); } int main(int argc, char **argv) { int N; scanf("%d\n", &N); int result = 0; struct item *root = newItem(-1); for (int i = 0; i < N; i++) { int c; struct item *current = root; /* Reads through the telephone number, moving along the corresponding branches of the tree and adding nodes if needed*/ while ((c = getchar()) != '\n' && c != EOF) { if (getChild(current, c-'0') == NULL) { addChild(current, c-'0'); result++; } current = getChild(current, c-'0'); } } free(root); printf("%d\n", result); return EXIT_SUCCESS; }