两个整数求和(链表)
创始人
2024-01-22 13:08:05
0

问题描述 

【问题描述】

给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295

输出:2 -> 1 -> 9,即912

【输入形式】

第一行输入第1个整数(逆序);

第二行输入第2个整数(逆序);

每个数位以空格分隔。

【输出形式】

输出和的逆序。

【样例输入】

7 1 6 e

5 9 2 e

【样例输出】

2 1 9

【样例说明】

样例中的e,表示输入以非法整数作为输入结束;

两个整数的位数不一定相同,即有可能1+11111

也可能会出现,某个整数不存在的情况(即链表为空链的情况)

【评分标准】

不允许修改程序其他结构,只补充加法函数。

程序设计 

#include
#include

typedef  int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList initList()
{
    LinkList head;
    head=(LinkList)malloc(sizeof(LNode));
    if(head==NULL)
    {
        return NULL;
    }
    head->next=NULL;
    return head;
}
//在链表末尾插入结点,并返回尾指针
LinkList insertListTail(LinkList tail, ElemType e)
{
    LinkList s;
    if(tail==NULL)
    {
        return 0;
    }
    s=(LinkList)malloc(sizeof(LNode));
    if(s==NULL)
    {
        return 0;
    }
    s->data=e;
    s->next=tail->next;
    tail->next=s;
    tail=s;
    return tail;
}
void printList(LinkList head)
{
    LinkList p=head->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
//函数返回结果链表
LinkList addList(LinkList ha,LinkList hb)
{
    int x=0,y=0,i=0,j=0,k;
    int a[100],b[100];
    LinkList p,q,hc,s;
    p=ha->next;
    q=hb->next;
    if(p==NULL) return hb;
    if(q==NULL) return ha;
    while(p){
        a[i++]=p->data;
        p=p->next;
    }
    i--;
    while(i>=0){
        x=x*10+a[i];
        i--;
    } 
    while(q){
        b[j++]=q->data;
        q=q->next;
    }
    j--;
    while(j>=0){
        y=y*10+b[j];
        j--;
    }
    hc=(LinkList)malloc(sizeof(LNode));
    hc->next=NULL;
    s=hc;
    int sum=x+y;
    while(sum){
        LinkList r=(LinkList)malloc(sizeof(LNode));
        r->next=NULL;
        r->data=sum%10;
        sum=sum/10;
        s->next=r;
        s=r;
    }
    return hc;
}
int main()
{
    LinkList ha,ta,hb,tb,hc;
    ElemType e;
    ta=ha=initList();
    tb=hb=initList();
    while(scanf("%d",&e)==1){
        ta=insertListTail(ta,e);
    }
    getchar();
    while(scanf("%d",&e)==1){
        tb=insertListTail(tb,e);
    }
   // printList(ha);
   // printList(hb);
    hc=addList(ha,hb);
    printList(hc);
    return 0;

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...