7-2 一元多项式的乘法与加法运算 (20 分)

7-2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

这题本来用数组模拟的,但是既然学了链表,就应该练习一下

代码;
 

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define LIST_INIT_SIZE 100000
#define LISTINCREMENT 10
#define mod 256
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
using namespace std;
const int maxn = 10000 + 7;
typedef struct LNode {
    int a,b;
    struct LNode* next;
}LNode,*LinkList;
void CreateList(LinkList&L){
    int n;
    scanf("%d",&n);
    L =(LinkList)malloc(sizeof(LNode));
    LinkList p = L;
    L->next = NULL;
    while(n--){
        LinkList q;
        q = (LinkList)malloc(sizeof(LNode));
        scanf("%d%d",&q->a,&q->b);
        q->next = NULL;
        p->next = q;
        p = q;
    }
}
void print(LinkList&L){
    if(L->next==NULL) printf("0 0\n");
    else {
        int i=0;
        LinkList p = L->next;
        while(p){
            if(i++>0) printf(" ");
            printf("%d %d",p->a,p->b);
            p = p->next;
        }
        printf("\n");
    }
}
void AddList(LinkList&A,LinkList&B,LinkList&C){
    C = (LinkList)malloc(sizeof(LNode));
    C->next = NULL;
    LinkList pa,pb,pc;
    pa = A->next;
    pb = B->next;
    pc = C;
    while(pa&&pb){
        LinkList q = (LinkList)malloc(sizeof(LNode));
        if(pa->b==pb->b){
            q->a = pa->a+pb->a;
            q->b = pa->b;
            pa = pa->next;
            pb = pb->next;
        }else if(pa->b>pb->b){
            q->a = pa->a;
            q->b = pa->b;
            pa = pa->next;
        }else{
            q->a = pb->a;
            q->b = pb->b;
            pb = pb->next;
        }
//        cout<<q->a<<" "<<q->b<<endl;
        if(q->a!=0){
            pc->next = q;
            pc = q;
        }
    }
//    while(pb) {cout<<pb->a<<" "<<pb->b<<endl; pb = pb->next;}
    pc -> next = pa?pa:pb;
}
void InsertList(LinkList&L,int a,int b){
    LinkList q = (LinkList)malloc(sizeof(LNode));
    if(a==0) return;
    q->a = a;
    q->b = b;
    q->next = NULL;
    LinkList p = L;
    bool flag = false;
    while(p->next){
        if(p->next->b==b){
            p->next->a+=a;
            if(p->next->a==0){
                LinkList q=p->next;
                p->next = q->next;
                free(q);
            }
            flag = true;
            break;
        }
        if(p->next->b<b){
            q->next = p->next;
            p->next = q;
            flag = true;
            break;
        }
        p = p->next;
    }
    if(!flag){
        p -> next = q;
    }
}
void MulList(LinkList&A,LinkList&B,LinkList&C){
    LinkList pa,pb;
    pa = A->next;
    pb = B->next;
    while(pa){
        pb = B->next;
        while(pb){
            if(pa->a)
            InsertList(C, pa->a*pb->a, pa->b+pb->b);
            pb = pb->next;
        }
        pa = pa->next;
    }
}
int main(){
    LinkList A,B,C,D;
    D =(LinkList)malloc(sizeof(LNode));
    D->next = NULL;
    CreateList(A);
    CreateList(B);
    MulList(A, B, D);
    AddList(A, B, C);
    print(D);
    print(C);
}

猜你喜欢

转载自blog.csdn.net/Insist_77/article/details/82914477
今日推荐