1001

Description

通过有序对输入多项式的各个项,利用单链表存储该一元多项式,并建立的2个存储一元多项式的单链表,然后完成2个一元多项式的相加,并输出相加后的多项式。

Input

输入数据有多组,对于每组测试数据,第一行一个整数n,表示第一个多项式La的项数;接下来n行,每行表示多项式的一项,包含两个元素,表示系数和指数;接下来一个整数m,表示第二个多项式Lb的项数;接下来m行,每行表示多项式的一项,包含两个元素,表示系数和指数;两个多项式的输入都是按指数从小到大。(n,m<=1000)

Output

La与Lb相加之后的多项式。 按指数从小到大输出,每行一项,用空格把系数和指数分开。

Sample Input

3
1 2
2 3
3 4
3
4 3
2 5
4 6

Sample Output

1 2
6 3
3 4
2 5
4 6

 

#include<cstdio>//1001
#include<iostream>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct Lnode
{
    ElemType coef;//系数
    ElemType exp;//指数
    struct Lnode *next;//结点的指针域
}Lnode,*LinkList;
ElemType CreateListTail_L(LinkList &L,int n)//尾插法创建一个链表
{
    L=(LinkList)malloc(sizeof(Lnode));
    LinkList r,p;
    r=L;//r是指向单链表尾部的结点,(此时的表是空表,则指向表头)
    for(int i=n;i>0;--i)//将元素循环插入表位
    {
        p=(LinkList)malloc(sizeof(Lnode));
        scanf("%d%d",&p->coef,&p->exp);
        r->next=p;//让中介结点P变成已经输入进去的第一个结点r的下一个结点
        r=p;//让新插进来的p成为新的尾部结点
    }
    r->next=NULL;
}
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    LinkList pa,pb,pc;
    pa=(LinkList)malloc(sizeof(Lnode));
    pb=(LinkList)malloc(sizeof(Lnode));
    pc=(LinkList)malloc(sizeof(Lnode));
    Lc=(LinkList)malloc(sizeof(Lnode));
    pa=La->next;pb=Lb->next;//指向头节点
    Lc=pc=La;//让pc指向La链表的头结点,再让pc指向Lc的头结点,如果不让Lc=pc则会出错 
while(pa&&pb)
    {
        if(pa->exp<pb->exp)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else if(pa->exp>pb->exp)
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
        else
        {
            pa->coef+=pb->coef;
            if(pa->coef)
            {
                pc->next=pa;
                pc=pa;
            }
            pa=pa->next;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;//woc这里不写成这样就不行,if(pa!=NULL)pc->next=pa;
    free(Lb);//                                  if(pb!=NULL)pc->next=pb;这样就不对,什么神奇玩意儿
}
int main()
{
    int n,m;
    while(scanf("%d",&n)!=EOF)
    {
        LinkList La;
        La=(LinkList)malloc(sizeof(Lnode));
        CreateListTail_L(La,n);
        scanf("%d",&m);
        LinkList Lb;
        Lb=(LinkList)malloc(sizeof(Lnode));
        CreateListTail_L(Lb,m);
        LinkList Lc;
        Lc=(LinkList)malloc(sizeof(Lnode));
        MergeList_L(La,Lb,Lc);
        LinkList p;
        p=(LinkList)malloc(sizeof(Lnode));
        p=Lc->next;//p指向Lc的头结点
        while(p)//输出调用函数得到的Lc
        {
            printf("%d %d\n",p->coef,p->exp);
            p=p->next;
        }
        free(La);
        free(Lc);
    }
    return 0;
}
posted @ 2020-05-07 19:16  楼阁的猫  阅读(182)  评论(0编辑  收藏  举报