/* Auto-complete data type */ static void add_number (Digit **start, MokoContactEntry *entry) { gint len, i; Digit *cur; if (*start == NULL) *start = new_digit (NULL); cur = *start; len = strlen (entry->number); for (i = 0; i < len; i++) { gchar c = entry->number[i]; gint n = c - '0'; if (n < 0 || n > 9) n = 10; if (cur->digits[n]) { cur = cur->digits[n]; if (g_list_length (cur->results) < 3) cur->results = g_list_append (cur->results, entry); continue; } else { cur->digits[n] = new_digit (cur); cur = cur->digits[n]; cur->results = g_list_append (cur->results, entry); } } }
int main(int argc, const char *argv[]){ int i; node *a, *b, *p; for(a=NULL, i=0; argv[1][i]; ++i) p = new_digit(argv[1][i]-'0'), p->next = a, a = p; for(b=NULL, i=0; argv[2][i]; ++i) p = new_digit(argv[2][i]-'0'), p->next = b, b = p; print(sum_number(a, b)); puts(""); return 0; }
node* sum_number(node *a, node *b){ char sum, carry; node *head, *end; // sum each digit for(head=end=new_digit(-1), sum=carry=0; a || b; a=NEXT(a), b=NEXT(b)){ sum = DIGIT(a) + DIGIT(b) + carry; carry = sum>9; end = end->next = new_digit(sum % 10); } // add extra digit when applicable if(carry) end->next = new_digit(carry); // delete first dummy node a = head->next; free(head); return a; }