#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//https://leetcode.cn/problems/add-two-numbers/?favorite=2cktkvj
//link node as number, to add them
/*
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
*/
#define MAX_LEN 128
typedef struct _NODE {
int value;
struct _NODE *next;
} NODE;
static NODE *add_num_in_link(const NODE *alink, const NODE *blink)
{
int overflow = 0;
const NODE *p1 = alink;
const NODE *p2 = blink;
NODE *head = NULL, *p3 = NULL;
while (p1 || p2 || overflow) {
if (p1) {
overflow += p1->value;
p1 = p1->next;
}
if (p2) {
overflow += p2->value;
p2 = p2->next;
}
NODE *tmp = (NODE *)malloc(sizeof(NODE));
tmp->value = overflow % 10;
tmp->next = NULL;
if (p3) {
p3->next = tmp;
p3 = tmp;
}
if (head == NULL) {
head = tmp;
p3 = tmp;
}
overflow = overflow / 10;
}
return head;
}
static NODE *construct_link(const char *in_str)
{
int len = strlen(in_str);
if ((len <= 0) || (len >= MAX_LEN))
return NULL;
int pos = len - 1;
NODE *p = (NODE *)malloc(sizeof(NODE));
p->value = in_str[pos] - '0';
p->next = NULL;
NODE *head = p;
for (pos = pos - 1; pos >= 0; pos--) {
NODE *tmp = (NODE *)malloc(sizeof(NODE));
tmp->value = in_str[pos] - '0';
tmp->next = NULL;
p->next = tmp;
p = tmp;
}
return head;
}
static void output_link(const NODE *link)
{
const NODE *p = link;
while(p != NULL) {
printf("%d", p->value);
p = p->next;
}
}
static void free_link(NODE *link)
{
NODE *p = link;
while(p != NULL) {
NODE *tmp = p->next;
free(p);
p = tmp;
}
}
int main(void)
{
static char a_str[MAX_LEN], b_str[MAX_LEN];
printf("please input two number (could be large):\n");
gets(a_str);
gets(b_str);
NODE *alink = construct_link(a_str);
NODE *blink = construct_link(b_str);
NODE *clink = add_num_in_link(alink, blink);
printf("alink: ");
output_link(alink);
printf("\n");
printf("blink: ");
output_link(blink);
printf("\n");
printf("clink: ");
output_link(clink);
printf("\n");
free_link(alink);
free_link(blink);
free_link(clink);
return 0;
}
链表实现两数-大数相加
于 2023-01-21 19:53:31 首次发布