demo/reverse_linked_number.c

64 lines
1.2 KiB
C

#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;
}