多项式加法运算 使用链表实现

/*
多项式加法运算
使用链表实现
*/
#include <iostream>
using namespace std;

//使用不带头结点的单向链表,按照指数递减的顺序排列
typedef struct PolyNode
{
    int coef;    //系数
    int expon;    //指数
    PolyNode *link;    //指向下一个节点的指针
}*polynomial, npolynomial;

polynomial PolyAdd(polynomial p1, polynomial p2);
int Compare(int p1e, int p2e);
void Attach(int coef, int expon, polynomial &pRear);
polynomial CreatePoly(int size);

int main()
{
    polynomial p1, p2, sump;
    p1 = CreatePoly(5);
    p2 = CreatePoly(8);

    sump = PolyAdd(p1, p2);

    cout << "p1:" << endl;
    while (p1)
    {
        cout << p1->coef << "x^" << p1->expon << ‘+‘;
        p1 = p1->link;
    }
    cout << endl;

    cout << "p2:" << endl;
    while (p2)
    {
        cout << p2->coef << "x^" << p2->expon << ‘+‘;
        p2 = p2->link;
    }
    cout << endl;

    cout << "sump:" << endl;
    while ( sump )
    {
        cout << sump->coef << "x^" << sump->expon << ‘+‘;
        sump = sump->link;
    }
    cout << endl;
    return 0;
}

polynomial PolyAdd(polynomial p1, polynomial p2)
{
    polynomial front, rear, temp;
    int sum;
    rear = new npolynomial;    //为方便表头插入,先产生一个临时空结点作为结果多项式链表头
    front = rear;    //由front记录结果多项式链表头结点
    while ( p1 && p2 )    //当两个多项式都有非零项待处理时
    {
        switch (Compare(p1->expon, p2->expon))
        {
        case 1:    //p1中的数据项指数较大
            Attach(p1->coef, p1->expon, rear);
            p1 = p1->link;
            break;
        case -1:    //p2中的数据项指数较大
            Attach(p2->coef, p2->expon, rear);
            p2 = p2->link;
            break;
        case 0:    //两数据项指数相等
            sum = p1->coef + p2->coef;
            if (sum)    //判断系数和是否为0
            {
                Attach(sum, p1->expon, rear);
            }
            p1 = p1->link;
            p2 = p2->link;
            break;
        }
    }
    //将未处理完的另一个多项式的所有节点依次复制到结果多项式去
    while ( p1 )
    {
        Attach(p1->coef, p1->expon, rear);
        p1 = p1->link;
    }
    while (p2)
    {
        Attach(p2->coef, p2->expon, rear);
        p2 = p2->link;
    }
    rear->link = NULL;
    temp = front;
    front = front->link;    //使front指向结果多项式第一个非零项目
    delete temp;
    return front;
}

int Compare(int p1e, int p2e)
{
    if ( p1e > p2e )
    {
        return 1;
    }
    else if (p1e < p2e)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}

void Attach(int coef, int expon, polynomial &pRear)
{
    //由于本函数需要改变当前结果表达式尾项指针的值;
    //因此函数传递进来的是结点指针的地址,p指向尾项
    polynomial p;

    p = new npolynomial;
    p->coef = coef;
    p->expon = expon;
    //将P指向的新结点插入到当前结果表达式尾项的后面
    pRear->link = p;
    pRear = p;
}

polynomial CreatePoly(int size)    //降序建立多项式
{
    polynomial head, p;
    head = NULL;
    p = NULL;
    for (int i = 0; i < size; i++)
    {
        p = new npolynomial;
        p->link = NULL;
        p->coef = i;
        p->expon = i;
        if ( head != NULL )    //在链表头部插入
        {
            p->link = head;
            head = p;
        }
        else
        {
            head = p;
        }
    }
    return head;
}
时间: 2024-10-25 03:49:29

多项式加法运算 使用链表实现的相关文章

一元稀疏多项式加法运算

描述: 设计一个一元稀疏多项式加法运算器,完成多项式a和b相加,建立多项式a+b. 输入说明: 一组输入数据,所有数据均为整数.第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数:第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数:第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数.(注:序列按指数升序排列) 输出说明: 在一行以类多项式形式输出结果,指数按从低到高的顺序.注意,系数值为1的非零次项的输出形式中略去系数1,如

[DataStructure]多项式加法与乘法--B.链表存储(适用于零元系数多的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 基本思想:加法和乘法都是把得数项直接链接在链表后面,最后统一做一个Merge&Sort工作即可.方便又快捷. (1)建立存储结构 1 struct _Poly 2 { 3 int factor;//系数 4 int Index;//幂 5 struct _Poly* next;//下一节点 6 }; 7 _Poly* poly[MAXTIMES+1]; 8 int Sum[MAXTIMES+1

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

一元多项式的乘法与加法运算——链表实现

题目:设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 即f1(x)=3x4-5x2+6x-2 f2(x)=5x

图解算法:单向链表做加法运算

问:给出两个非空的链表,来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且每个结点只能存储一位数字.将这两个链表相加起来,返回一个新的链表,表示他们之和. 例如:342 + 465 = 807 两数相加这道题,处理的就是最简单的数学加法运算,只是它是建立在链表的基础之上,所以难度在于对链表的处理. 加法运算,除了每一位的加法之外,还需要考虑进位的情况.针对这道题来说,链表的每一个结点存储一位数字,并且是基于自然数字逆序存储,也就是链头到链尾保持低到高位的顺序,这样就等于,进位

[DataStructure]多项式加法与乘法--A.数组存储(适用于零元系数少的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 (1)建立存储结构 1 struct _Poly 2 { 3 double Data[MAXTIMES+1]; 4 int Times; 5 }; 6 struct _Poly Poly[N+1]; (2)主程序架构 1 int main() 2 { 3 int Sum; 4 cout<<"请输入要做运算的多项式数量"<<endl; 5 cin>>

[PAT] 一元多项式的乘法与加法运算 C语言实现

[PAT] 02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出

多项式相加运算

 多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录 //实现多项式的表示及相加 by Denis #include <stdio.h> #include <malloc.h> #define ture 1 #define false 0 typedef int ElemType; typedef struct LNode{ ElemType coef; //系数 int expn; //指数 struct LNode *next; }polynomia; pol

SCOI2013 多项式的运算 (BZOJ 3323)

似乎仍然不能附传送门..权限题T_T... 3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec  Memory Limit: 64 MB Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) = a0 * x^0 + a1 * x^1 + a2 *