一元多项式的运算

以一元多项式加法运算为例:

A,B可用线性链表可以表示为:

“和多项式”链表如下(图中的长方框表示已经被释放的结点):

#include <stdio.h>
#include <stdlib.h>
typedef struct Polyn{
    int data;
    int index;
    struct Polyn *next;
}Polyn,*Polynlist;
void CreatPolyn(Polynlist &p,int m)//输入m项的系数和指数,建立一元多项式P
{
    //有头结点
    Polyn *q=p;
    for(int i=0;i<m;i++)
    {
        q->next=(Polyn*)malloc(sizeof(Polyn));
        q=q->next;
//        printf("第%d项系数、指数:",i+1);
        scanf("%d%d",&q->data,&q->index);
    }
    q->next=0;
}
void PrintPolyn(Polynlist &p)//打印一元多项式P
{
    Polyn *q=p->next;
    //(x^0)和(x^1)要做特别处理
    if(q->index == 0)
    {
        printf("%d",q->data);
        //可能第二项指数为x
        q=q->next;
        if(q && q->index == 1)
        {
            if(q->data != 1)
                printf("%+dx",q->data);//正数则在前面加+,否则不加
            else
                printf("+x");
            q = q->next;
        }
    }
    else if(q->index == 1){
        if(q->data != 1)
            printf("%dx",q->data);
        else
            printf("x");
        q = q->next;
    }
    else{
        printf("%dx^%d",q->data,q->index);
        q = q->next;
    }
    while(q)
    {
        printf("%+dx^%d",q->data,q->index);
        q=q->next;
    }
    printf("\n");
}
void CopyPolyn(Polynlist &q,Polyn *r)//空指针必须引用去创建,新开辟结点链表并复制(数据域和指针域)
{
    q = (Polyn *)malloc(sizeof(Polyn));
    Polyn *q1 = q,*r1 = r->next;
    while(r1)
    {
        q1->next = (Polyn *)malloc(sizeof(Polyn));
        q1 = q1->next;
        q1->data = r1->data;
        q1->index = r1->index;
        r1 = r1->next;
    }
    q1->next = NULL;
}
void ShowMenu()
{
    printf("\t\t\t1.多项式相加\n");
    printf("\t\t\t2.多项式相减\n");
    printf("\t\t\t3.多项式相乘\n");
    printf("\t\t\t4.退出\n");
}
void AddPolyn(Polyn *p,Polyn *p1)//完成多项式相加运算,p=p+p1,并销毁p1
{
    Polyn *qa,*qb,*prior,*r;//设置prior是为B链表中的结点插入A链表用
    prior = p;
    qa = p->next;
    qb = p1->next;
    while(qa && qb)
    {
        if(qa->index < qb->index)
        {
            prior = qa;
            qa = qa->next;
        }
        else if(qa->index > qb->index){
            r = qb;
            qb = qb->next;
            //摘取qb到“和多项式”链表中
            r->next = qa;
            prior->next = r;
            //更新prior
            prior = r;
        }
        else{
            if(qa->data + qb->data != 0)
            {
                //修改qa所指结点的系数值,同时释放qb所指的结点
                qa->data = qa->data + qb->data;
                r = qb;
                qb = qb->next;
                free(r);
            }
            else{
                //释放指针qa和qb所指的结点
                r = qa;
                qa = qa->next;
                prior->next = qa;//衔接
                free(r);
                r = qb;
                qb = qb->next;
                free(r);
            }
        }
    }
    //B链表还有结点
    if(qb)
    {
        prior->next = qb;//此时qa已为空指针
    }
    free(p1);//释放B头结点
}
void reverse(Polyn *p)
{
    Polyn *q = p->next;
    while(q)
    {
        q->data = -(q->data);
        q = q->next;
    }
}
void DestroyPolyn(Polyn *r)
{
    Polyn *q;
    do{
        q = r;
        r = r->next;
        free(q);
    }while(r);
}
void AdjustPolyn(Polyn *r,int data,int index)//调整每一项
{
    Polyn *q = r->next;
    while(q)
    {
        q->data *= data;
        q->index += index;
        q = q->next;
    }
}
void SubtractPolyn(Polynlist &p,Polynlist &p1)//完成多项式相减运算,p=p-p1,并销毁p1
{
    reverse(p1);//将B链表的data域置反
    AddPolyn(p,p1);
}
void MultiplyPolyn(Polynlist &p,Polyn *p1)//完成多项式相乘运算,p=p*p1,并销毁p1
{
    Polyn *q,*r = NULL,*r1 = NULL;
    q = p1->next;
    //A(x)--》bi*A(x)*x^ei
    CopyPolyn(r,p);
    AdjustPolyn(r,q->data,q->index);
    q = q->next;
    while(q)
    {
        CopyPolyn(r1,p);
        AdjustPolyn(r1,q->data,q->index);
        AddPolyn(r,r1);//r1将被销毁
        r1 = NULL;//必须将r1置空
        q = q->next;
    }
    //r-->p,同时释放r链表
    DestroyPolyn(p);
    p = NULL;
    CopyPolyn(p,r);
    DestroyPolyn(r);
}
int main()
{
    int m;
    Polyn *p=(Polyn*)malloc(sizeof(Polyn));
    Polyn *p1=(Polyn*)malloc(sizeof(Polyn));
    Polyn *p2 = NULL,*p3 = NULL;
    printf("按升幂输入多项式A(x),B(x)的系数,指数\n");
    printf("A(x)的项数:");
    scanf("%d",&m);
    CreatPolyn(p,m);
    printf("A(x)=");
    PrintPolyn(p);
    printf("B(x)的项数:");
    scanf("%d",&m);
    CreatPolyn(p1,m);
    printf("B(x)=");
    PrintPolyn(p1);
    //保存A,B原始多项式,此处的复制是新开辟结点链表
    CopyPolyn(p2,p);
    CopyPolyn(p3,p1);
    system("pause");
    system("cls");
    printf("A(x)=");
    PrintPolyn(p);
    printf("B(x)=");
    PrintPolyn(p1);
    printf("选择以下一种操作方式:\n");
    ShowMenu();
    do{
        printf("请输入你的选择:");
        scanf("%d",&m);
        switch(m)
        {
        case 1:
            AddPolyn(p,p1);
            printf("A(x)+B(x)=");
            PrintPolyn(p);
            break;
        case 2:
            SubtractPolyn(p,p1);
            printf("A(x)-B(x)=");
            PrintPolyn(p);
            break;
        case 3:
            MultiplyPolyn(p,p1);
            printf("A(x)*B(x)=");
            PrintPolyn(p);
            break;
        default:
            exit(0);
        }
        fflush(stdin);
        DestroyPolyn(p);
        p1 = p = NULL;//此时的p、p1为游离指针,必须要置空
        CopyPolyn(p,p2);
        CopyPolyn(p1,p3);
    }while(1);
    return 0;
}

运行结果截图:

按Enter键之后

时间: 2024-10-27 10:53:36

一元多项式的运算的相关文章

一元多项式的表示及相加

符号多项式的操作,已经成为表处理的典型用例,在数学上,一个一元多项式Pn(x)可按升幂写成: Pn(x)=p0+p1x1+p2x2+p3x3+…+pnxn 它由n+1个系数惟一确定.因此,在计算机里,它可用一个线性表P来表示: P=(p0,p1,p2,p3,…,pn) 每一项的指数i隐含在其系数pi的序号里. 本节内容将主要讨论如何利用线性链表的基本操作为实现一元多项式的运算. 利用线性链表的基本操作来实现一元稀疏多项式的运算,实现抽象数据类型Polynomial. ADT Polynomial

线性表及其实现(1)

线性表及其实现(1) 多项式的表示: [例]一元多项式及其运算 一元多项式: 主要运算:多项式相加.相减.相乘等. [分析]如何表示多项式? ? 多项式项数n ? 各项系数ai 及指数 i 方法一:顺序存储结构直接表示 数组各分量对应多项式各项: a[i]: 项xi的系数ai 两个多项式相加:两个数组对应的分量相加 弊端:当表示x+2x2000 时将会浪费大量的存储空间,且效率低下. 方法二:顺序存储结构表示非零项 每个非零项 aixi 涉及两个信息:系数 ai 和指数 i  可以将一个多项式看

[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 输出

MyMathLib系列(一元多项式运算求初等因子等)

利用TExp类的运算来求矩阵的特征值,初等因子等: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMathLib { /// <summary> /// 一元多项式计算 /// </summary> public class PolynomialOfOneBasic { /// <summary> /// 化成对阶梯矩阵

数据结构和算法-一元多项式运算算法(加法)

算法名称:一元多项式算法 算法介绍: 加法运算:将具有与相同幂项的系数相加即可得到合并后的多项式.若某个幂项只存在于一个多项式中,则直接合并到结果中 举例 利用代码实现 这里主要使用了链表,通过3个函数来进行操作.分别是Inpu函数,Add运算函数,打印函数. 代码: /*采用链表的方式*/ #include<stdio.h> #include<stdlib.h> #include<limits.h> typedef struct polyn //定义多项式的结构 {

线性表在一元多项式运算中的应用

实验题1-1 多项式运算 [问题描述]有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积. [提示] 用带表头结点的单链表作为多项式的存储表示:要建立两个单链表:多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入.删除操作中指针的正确修改. #include <iostream> using namespace std; int k = 1; typedef struct { float coef; //系数 int expn; //指数 }term;

一元多项式的表示及加减乘除运算

例如:如何实现用线性链表表示多项式的加法运算? 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成"和多项式"中的一项:对于两个一元多项式中所有指数不相同的项,则分别复抄到"和多项式"中去. #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct polyn { float coef; i

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

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

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

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