数据结构与算法3:链表3

计算两个分别表示数位的链表求和,其实更通用的就是用链表表示大数,然后求和,求差等类型的问题

简单实现如下,需要注意的是进位

#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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值