两个整数求和(链表)
创始人
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;

 

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...