On Mon, Jan 22, 2007 at 10:30:29AM +0000, Jon Dowland wrote: > I think it's our duty to provide the most cunning/evil > solution possible then :)
Probably not all that evil or cunning by most people's standards, but here's my solution. I tried to do a continuation-passing-style tail recursive thing, but my C skills aren't up to it. -- Jon Dowland
#include <stdio.h> #include <stdlib.h> /* * find the number of unique values in an array */ typedef enum { false, true, } boolean; struct node { struct node * next; int val; }; boolean in_list(const int val, const struct node *list) { if(NULL == list) return false; return val == list->val || in_list(val, list->next); } struct node * add_to_list(const int val, struct node *list) { if(NULL == list) { list = malloc(sizeof(struct node)); if(!list) { fprintf(stderr,"error allocating list node\n"); exit(1); } list->val = val; list->next = NULL; } else list->next = add_to_list(val, list->next); return list; } int list_size(const struct node *list) { if(NULL == list) return 0; return 1 + list_size(list->next); } int main(int argc, char **argv) { int i; struct node *p, *list = NULL; if(argc < 2) { fprintf(stderr, "usage: %s number [ number ... ]\n", argv[0]); exit(1); } /* populate the unique list */ for(i = 1; i < argc; ++i) { int val = atoi(argv[i]); if(!in_list(val, list)) { list = add_to_list(val, list); } } /* loop and print out the list */ for(p = list; NULL != p; p = p->next) { printf("%d ", p->val); } printf("\n"); /* now for the new array */ printf("number of unique numbers: %d\n", list_size(list)); return 0; }