#include <stdio.h>
#include <stdlib.h>

typedef struct _st_node {
    struct _st_node *next;
    int val;
} st_node;


st_node *node_alloc(int val, st_node *next)
{
    st_node *node = (st_node *)malloc(sizeof (st_node));
    node->next = next;
    node->val = val;
    return node;
}

st_node *node_sum_r(int carry_up, st_node *p, st_node *q)
{
    if (p) carry_up += p->val;
    if (q) carry_up += q->val;
    if (!p && !q && !carry_up) return 0;
    return node_alloc(carry_up % 10,
                        node_sum_r(carry_up / 10,
                                    p ? p->next : 0,
                                    q ? q->next : 0));
}

st_node *node_sum(st_node *p, st_node *q)
{
    if (!p || !q) return 0;
    return node_sum_r(0, p, q);
}

st_node *str_to_node(char *num)
{
    if (!*num) return 0;
    return node_alloc(*num - '0', str_to_node(num + 1));
}

void node_show_r(st_node *node)
{
    if (!node) return;
    node_show_r(node->next);
    printf("%d", node->val);
    return;
}

void node_show(st_node *node)
{
    node_show_r(node);
    printf("\n");
    return;
}

int main()
{
    st_node *l1 = str_to_node("99");
    st_node *l2 = str_to_node("9999");
    st_node *ls = node_sum(l1, l2);
    node_show(ls);
    return 0;
}