计算两个分别表示数位的链表求和,其实更通用的就是用链表表示大数,然后求和,求差等类型的问题
简单实现如下,需要注意的是进位
#include <stdlib.h>
#include <stdio.h>
typedef struct tag_LinkNode
{
int data;
struct tag_LinkNode *next;
} LinkNode;
LinkNode * init_link(int num)
{
LinkNode *head = NULL;
LinkNode *pstLink;
srand(time(0));
while(num > 0)
{
pstLink = (LinkNode *)malloc(sizeof(LinkNode));
pstLink->data = rand()%10;
if (!head)
{
head = pstLink;
head->next = NULL;
continue;
}
pstLink->next = head->next;
head->next = pstLink;
num--;
}
return head;
}
void destory_link(LinkNode *head)
{
LinkNode *pstLink;
pstLink = head;
while(pstLink != NULL)
{
head = head->next;
free(pstLink);
pstLink = head;
}
}
void print_link(LinkNode *head)
{
LinkNode *pstLink;
pstLink = head;
while(pstLink != NULL)
{
printf("%d", pstLink->data);
pstLink = pstLink->next;
}
printf("\n");
}
LinkNode *add_two_list(LinkNode *head1, LinkNode *head2)
{
LinkNode *tmp1, *tmp2, *tmp;
LinkNode *head = NULL;
LinkNode *last = NULL;
int data1,data2;
int up = 0;
tmp1 = head1;
tmp2 = head2;
while(tmp1 != NULL && tmp2 != NULL || up != 0)
{
tmp = (LinkNode *)malloc(sizeof(LinkNode));
tmp->next = NULL;
if(head != NULL)
{
last->next = tmp;
}
else
{
head = tmp;
}
data1 = (tmp1 == NULL)?0:tmp1->data;
data2 = (tmp2 == NULL)?0:tmp2->data;
tmp->data = (data1+data2+up)%10;
up = ((data1+data2+up)>10)?1:0;
last = tmp;
if (tmp1 != NULL)
{
tmp1 = tmp1->next;
}
if (tmp2 != NULL)
{
tmp2 = tmp2->next;
}
}
return head;
}
int main(int argc, char *args[])
{
LinkNode *head1, *head2, *head3;
int num1,num2;
if (argc != 3)
{
printf("use a.out num1 num2\n");
return 1;
}
num1 = atoi(args[1]);
num2 = atoi(args[2]);
head1 = init_link(num1);
head2 = init_link(num2);
print_link(head1);
print_link(head2);
head3 = add_two_list(head1, head2);
print_link(head3);
destory_link(head1);
destory_link(head2);
destory_link(head3);
return 0;
}
效果如下,数字打印的时从左到右打印的,和我们计算的视角不一致:
root@ubuntu:/home/cling60/src/struct/LinkedList# ./a.out 10 10
46821883997
46821883997
827526778951
root@ubuntu:/home/cling60/src/struct/LinkedList# ./a.out 10 10
90373631622
90373631622
81647272254