代码改变世界

链表——竖式相加

2018-05-29 23:01  TaoGePureYeahMan  阅读(146)  评论(0)    收藏  举报

  等长度竖式相加,代码如下;非等长度添加值为零节点到等长度即可。未做。最高位还有进位也需要加一个节点,未做。

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "string.h"

struct Number

{

    int val;

    struct Number *next;

};



typedef struct Number Numb;



Numb *CreatListNum(int n)

{

    Numb *head;

    Numb *p , *pre;

    int i;

    head=(Numb *)malloc(sizeof(Numb));

    head->next=NULL;

    pre=head;

    printf("input number of the NUMBER !\n");

    for(i=1;i<=n;i++)

    {

        p=(Numb*)malloc(sizeof(Numb));

        scanf("%d",&p->val);

        pre->next=p;

        pre=p;//equ to pre=pre->next;

    }

    p->next=NULL;

    return head;

}



Numb *ListSum(Numb *number1,int num1Length,Numb *number2,int num2Length)

{

    Numb *head;

    Numb *p,*pre;

    int i,min,carry;

    carry=0;

    head=(Numb*)malloc(sizeof(Numb));

    head->next=NULL;

    pre=head;

    min=num1Length<num2Length ? num1Length:num2Length;

    for(i=0;i<min;i++)

    {

        p=(Numb*)malloc(sizeof(Numb));

        

        if(carry==0)

        {

            p->val=number1->val+number2->val;

        }

        if(carry==1)

        {

            p->val=number1->val+number2->val+1;

            carry=0;

        }

        if(p->val>=10)

        {

             carry=1;

            p->val=p->val%10;

        }



        

        pre->next=p;

        pre=p;

        number1=number1->next;

        number2=number2->next;    



    }

    return head; 

}



void PrintList(Numb *headp)

{

    Numb *p;

    p=headp->next;

    while(p)

    {

        printf("%d",p->val);

        p=p->next;



    }

        printf("\n");



}







void main()

{

    Numb *number1;

    Numb *number2;

    Numb *number3;



    int length1,length2;

    printf("Input Number1 length\n");

    scanf("%d",&length1);

    number1=CreatListNum(length1);

    PrintList(number1);

    

    printf("Input Number2 length\n");

    scanf("%d",&length2);

    number2=CreatListNum(length2);

    PrintList(number2);

    printf("The resule is :\n");

    

    number3= ListSum(number1->next,length1,number2->next,length2);

    PrintList(number3);

}

测试:

链表逆序存储数字,逆序输出,有便于进位

 

即:65432+19567=84999