关闭

多项式乘法与加法运算(链表实现)

标签: c语言链表
304人阅读 评论(0) 收藏 举报
#include<iostream>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode
{
    int coef;
    int expon;
    Polynomial link;
};

void Attach(int c, int e, Polynomial *pRear){
    Polynomial P;//这里有点小问题,按理说应该动态申请一块空间,可是加上P=new PolyNode后编译错误...也没太弄懂
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P;
    (*pRear) = P;
}

Polynomial Polyread(){
    int N,c,e;
    Polynomial Rear, P,t;
    cin >> N;
    P = new PolyNode;
    P->link = NULL;
    Rear = P;
    while (N--){
        cin >> c >> e;
        Attach(c, e, &Rear);
    }
    t = P; P = P->link; delete t;//删除临时生成的头结点
    return P;
}

Polynomial Add(Polynomial P1, Polynomial P2){
    Polynomial t1, t2, Rear, P;
    t1 = P1; t2 = P2;
    P = new PolyNode;
    P->link = NULL;
    Rear = P;
    while (t1&&t2){
        if (t1->expon > t2->expon){
            Attach(t1->coef, t1->expon, &Rear);
            t1 = t1->link;
        }
        if (t1->expon < t2->expon){
            Attach(t1->coef, t2->expon, &Rear);
        }
        if (t1->expon == t2->expon){
            if (t1->expon + t2->expon){
                Attach(t1->coef + t2->coef, t1->expon, &Rear);
                t1 = t1->link; t2 = t2->link;
            }
        }
    }
    return P;
}
Polynomial Mult(Polynomial P1, Polynomial P2){
    Polynomial t1, t2, Rear, P,t;
    int c, e;
    if (!P1 || !P2) return NULL;
    t1 = P1; t2 = P2;
    P = new PolyNode;
    P->link = NULL;
    Rear = P;
    while (t2){
        Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);
            t2 = t2->link;
    }
    t1 = t1->link;
    while (t1){
        t2 = P2; Rear = P;
        while (t2){
            e = t1->expon + t2->expon;
            c = t1->coef*t2->coef;
            while (Rear->link&&Rear->link->expon > e)
                Rear = Rear->link;
            if (Rear->link->expon == e){
                if (Rear->link->coef + c)
                    Rear->link->coef += c;
                else{
                    t = Rear->link; Rear->link = t->link; free(t);
                }
            }
            else{
                t = new PolyNode;
                t->coef = c; t->expon = e;
                t->link = Rear->link;
                Rear->link = t;
                Rear = Rear->link;
            }
            t2 = t2->link;
        }
    t1 = t1->link;
}
      t2 = P; P->link = t2->link; delete t2;
      return P;
}

void PrintPoly(Polynomial P){
    int flag = 0;
    if (!P) cout << 0 << 0 << endl;
    while (P){
        if (!flag) flag = 1;
        else
            cout << " ";
        cout << P->coef << P->expon;
        P = P->link;
    }
}
int main(){
    Polynomial P1, P2, PP, PS;
    P1 = Polyread();
    P2 = Polyread();
    PP = Add(P1, P2);
    PrintPoly(PP);
    PS = Mult(P1, P2);
    PrintPoly(PS);

    return 0;
}

代码并没有在编译器中实现,新手渣渣还在学习中,欢迎指正…

在网上看到的正确答案:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef struct Term{
    int coe;//系数
    int exp;//指数    
}Term;

bool compare(Term a,Term b)
{
    return a.exp>b.exp;
}

/*
Term Mul(Term a,Term b)
{
    a.coe = a.coe*b.coe;
    a.exp = a.exp+b.exp;
    return a;
}
*/

/*
Term Add(Term a,Term b)
{
    a.coe +=b.coe;
    return a;
}*/
void print(Term a)
{
    cout<<a.coe<<" "<<a.exp<<" ";
}
int main()
{

    vector<Term>    vec1;
    vector<Term>    vec2;
    vector<Term>    vec;
    vector<Term>::iterator  it1,it2;

    int N1,N2;
    int coe,exp;
    bool  flag = false;
    Term t;
    cin>>N1;
    while(N1--)
    {
        cin>>coe>>exp;
        t.coe = coe;
        t.exp = exp;
        vec1.push_back(t);
    }
    //for_each(vec1.begin(),vec1.end(),print);
    //system("pause");


    cin>>N2;
    while(N2--)
    {
        cin>>coe>>exp;
        t.coe = coe;
        t.exp = exp;
        vec2.push_back(t);
    }

    //for_each(vec2.begin(),vec2.end(),print);
    //system("pause");

    for (it1=vec1.begin();it1!=vec1.end();it1++)
        for (it2=vec2.begin();it2!=vec2.end();it2++)
        {
            t.coe = it1->coe * it2->coe;
            t.exp = it1->exp + it2->exp;    
            if (t.coe!=0)
            vec.push_back(t);

        }

    sort(vec.begin(),vec.end(),compare);

    for (it1 = vec.begin();it1!=vec.end();it1=it2)
      {  
          for (it2 = it1+1;it2!=vec.end() &&it1->exp==it2->exp;it2++)           
                   it1->coe += it2->coe;
            if (it1->coe!=0)
            {
                if (flag)
                cout<<" ";
                else
                flag = true;
                cout<<it1->coe<<" "<<it1->exp;
            }                  
      }
    if (vec1.size()==0)
    {
        cout<<"0 0";
    }
    cout<<endl;
    flag = false;

    for (it1=vec1.begin(),it2=vec2.begin();it1!=vec1.end()&&it2!=vec2.end();)
    {
        if (it1->exp >it2->exp)
        {
            if (flag)
                cout<<" ";
            else
                flag = true;
            cout<<it1->coe<<" "<<it1->exp;
            it1++;
        }
        else if (it1->exp < it2->exp)
        {
            if (flag)
                cout<<" ";
            else
                flag = true;
            cout<<it2->coe<<" "<<it2->exp;
            it2++;
        }
        else
        {

            if ((it1->coe+it2->coe))
            {
                if (flag)
                    cout<<" ";
                else
                    flag = true;
                cout<<it1->coe+it2->coe<<" "<<it1->exp;
            }

            it1++;
            it2++;
        }
    }

    if (it1==vec1.end())
    {
        while(it2!=vec2.end())
        {
            if (flag)
                cout<<" ";
            else
                flag = true;
            cout<<it2->coe<<" "<<it2->exp;
            it2++;
        }
    }

    if (it2==vec2.end())
    {
        while(it1!=vec1.end())
        {
            if (flag)
                cout<<" ";
            else
                flag = true;
            cout<<it1->coe<<" "<<it1->exp;
            it1++;
        }
    }

    if (flag==false)
    cout<<"0 0";
    cout<<endl;

     //for_each(vec.begin(),vec.end(),print);


    //system("pause");
    return 0;
}
1
0
查看评论

PAT 一元多项式的乘法与加法运算(链表 c++版)

题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。 用链表实现一元多项式的乘法与加法运算。 首先来看加法运算 多项式 poly1   x^4 + 3x^3 + 6x 多项式 poly2   6x^5 +...
  • chaiwenjun000
  • chaiwenjun000
  • 2015-09-09 22:45
  • 3517

用链表实现一元多项式的加、减、乘、求导运算

在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。   题目不难,将多项式的系数和指数存进链表,然后进行相应操作即可。   一、加法:     1、判断指数是否相等,若相等则将系数相加,相加后不为零就开辟新空间,将新的系数存入结点,尾插进新链表中。  ...
  • Jung_zhang
  • Jung_zhang
  • 2015-09-09 15:27
  • 3361

用链表实现一元多项式的加法运算

#include using namespace std; struct Node { int coef; int exp; Node * next; Node(){coef=0;exp=0;next=nullptr;} }; class Polyn { private: //int le...
  • fightingyxy
  • fightingyxy
  • 2016-02-26 19:13
  • 2803

【数据结构】用链表实现多项式运算

一元多项式的运算包括加法减法和乘法,而多项式的加法和乘法都可以依靠多项式的加法来实现,所以本文仅仅讲解如何用链表实现一元多项式的加法。 数学上的一元多项式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n; 用链表来表示就是p ...
  • shujh_sysu
  • shujh_sysu
  • 2016-08-08 12:31
  • 3459

PTA--一元多项式的乘法与加法运算

这个问题耗时90分钟才搞定,其中主要的逻辑用时30分钟,调输出格式用时60分钟。。。 我想起来这是我为什么很抵触去写OJ题,很多情况下是你想明白了问题的解法,但是在最后的格式输出上不能完全匹配,便被机器判定为错误的答案。 但是,做的多了,会爱上做OJ题,原因是,要准确匹配题中的所有要求,会逼着你...
  • u011240016
  • u011240016
  • 2016-10-04 19:46
  • 1000

PAT 3-04 一元多项式的乘法与加法运算(C语言实现)

题目描述: 设计函数分别求两个一元多项式的乘积与和。 输入格式说明: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式说明: 输出分2行,分别以指数递降方...
  • wutongyu0113
  • wutongyu0113
  • 2014-10-03 15:14
  • 1561

实战数据结构(9)_单链表实现多项式的相乘

/************************************************************************/ /* @author lynnbest 目标:多项式的乘法 exp: A(X)=2X^3+4 B(x)=4X^4+2X^3 C(X)=A(x)...
  • liuyunjay66
  • liuyunjay66
  • 2013-08-29 16:03
  • 3416

数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算

02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指...
  • cs_hmyy
  • cs_hmyy
  • 2015-09-30 19:19
  • 863

中国大学MOOC-陈越、何钦铭-数据结构 一元多项式的乘法与加法运算

哈哈哈,写出了困扰自己一个多星期的题目,心情真是好的不得了.顿时,自己内心生出了一种自豪感,这种解决了”难题”的感觉真是太美妙了. 回到题目来: 题目内容: 设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数...
  • qq_23849183
  • qq_23849183
  • 2015-09-27 23:42
  • 649

c++一元多项式的乘法和加法

首先是结点类:Term.h代码如下:#ifndef CH_H #define CH_H #include #include #include #include using namespace std; #endif struct Term { float coef; int exp; ...
  • tianjun2012
  • tianjun2012
  • 2014-03-26 20:28
  • 1173
    个人资料
    • 访问:2377次
    • 积分:171
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档