多项式加法

多项式加法
注释写的我觉得等以后我一定能看懂hhh~~·

需要以后注意的是
一个结点,只能引出一条指针,但是可以以有很多条指针指过去。

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType coef;    //系数
    ElemType expn;    //指数
    struct LNode *next;
} LNode,*Linklist;
Linklist Createlist_L(Linklist first,int n)  //尾插法创建链表
{
    Linklist rear,s;
    first=(Linklist)malloc(sizeof(LNode)); //头节点
    rear=first;  //尾节点
    for(int i=0; i<n; i++)
    {
        s=(Linklist)malloc(sizeof(LNode)); //建立新节点
        scanf("%d%d",&s->coef,&s->expn);
        rear->next=s; //将新节点插入到队尾
        rear=rear->next;
    }
    rear->next=NULL;  //将尾节点指向空
    return first;
}
Linklist AddList(Linklist M,Linklist N)   //多项式加法
{
    Linklist pa,pb,pc,c;    //pa,pb分别指向两条链M,N,pc用来实时更新,c为新链头节点。
    c=(Linklist)malloc(sizeof(LNode));   //因为c点为新链,尚无头节点申请的内存。
    pa=M->next;
    pb=N->next;
    pc=c;
    while(pa!=NULL&&pb!=NULL)  //两链分别比较指数,指数大的连上,然后该端指针下移
    {
        if(pa->expn>pb->expn)
        {
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
        }
        else if(pa->expn<pb->expn)
        {
            pc->next=pb;
            pc=pc->next;
            pb=pb->next;
        }
        else
        {
            pa->coef+=pb->coef;   //两端指数相同的情况,需要两端同时下移
            if(!(pa->coef))
            {
                pa=pa->next;
                pb=pb->next;
            }
            else
            {
                pc->next=pa;
                pc=pc->next;
                pa=pa->next;
                pb=pb->next;
            }
        }
    }
    if(pa==NULL&&pb!=NULL)   //两链剩余的部分直接连上
    {
        pc->next=pb;
    }
    if(pb==NULL&&pa!=NULL)
    {
        pc->next=pa;
    }
    return c;
}
void Printlist(Linklist L)  //输出
{
    L=L->next;  //跳过头节点
    while(L!=NULL)
    {
        printf("%d %d\n",L->coef,L->expn);
        L=L->next;
    }
    return ;
}
int main()
{
    Linklist i,j,k;
    int n,m;
    scanf("%d%d",&n,&m);
    i=Createlist_L(i,n);
    j=Createlist_L(j,m);
    k=AddList(i,j);
    Printlist(k);
    return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值