用插入法实现多项式的乘法

#include"iostream"
#include"stdio.h"
#include"string.h"
#include"algorithm"
#include"queue"
#include"stack"
#include"ctype.h"
#include"cmath"
#define mx 1005
using namespace std;

struct poly //链表节点数据类型
{
    double ceof;//系数
    int exp;//指数
    poly *next;
};
double A[mx],B[mx];//存放A和B表达式
int adegree,bdegree,maxexp;//存放最高阶数

void init(poly *&pl) //链表初始化
{
    pl=new poly;//动态分配空间,如果出现错误则输出 allocate error
    if(pl==NULL){cout<<"allocate error!"<<endl;}
    else
    {
        pl->next=NULL;
    }
}

void input(poly *&pl,int degree,double X[]) //表达式的输入(存入链表中)
{
    poly *t=pl;
    int i=0;
    while(i<=degree)
    {
        if(X[i]!=0) //系数为零的不用存
        {
            t->next=new poly;
            t=t->next;
            t->ceof=X[i];
            t->exp=i;
        }
        i++;
    }
    t->next=NULL;
}

void output(poly *&pl) //表达式的输出
{
    poly *t=pl->next;
    cout<<"the polynomal is:";
    bool h=true;
    while(t!=NULL)
    {
        if(!h) cout<<"+";
            h=false;
        if(t->ceof!=1||t->exp==0)
        cout<<t->ceof;
        switch(t->exp) //根据阶数输出相应的项
        {
            case 0:break;
            case 1:cout<<"x";break;
            default:cout<<"x^"<<t->exp;
        }
        t=t->next;
    }
    cout<<endl;
}

void insert_poly(poly *&pl,double ceof_,int exp_)
{
    poly *t,*pre,*newpoly;
    t=pl->next;pre=pl;
    while(t!=NULL&&t->exp>exp_)
    {
         pre=t;
        t=t->next;
    }
    if(t!=NULL&&t->exp==exp_)
    {
        t->ceof+=ceof_;
        if(t->ceof==0)//如果多项式系数为零,则删除
        {
            pre->next=t->next;
            delete t;
        }
    }
    else
    {
        newpoly=new poly;
        newpoly->ceof=ceof_;
        newpoly->exp=exp_;
        pre->next=newpoly;
        newpoly->next=t;
    }
}
void mul_poly(poly *&pla,poly *&plb,poly *&plc) //用插入法实现表达式相乘
{
    poly *ta,*tb;
    if(adegree!=-1&&bdegree!=-1) //没有零多项式,执行相乘运算
    {
        ta=pla->next;
        while(ta!=NULL)//模拟笔算多项式相乘
        {
            tb=plb->next;
            while(tb!=NULL)
            {
                insert_poly(plc,(ta->ceof)*(tb->ceof),ta->exp+tb->exp);
                tb=tb->next;
            }
            ta=ta->next;
        }
    }
}
int main()
{
    poly *pla,*plb,*plc;
    int i,j,_exp;
    double _ceof;
    char ch;
    int case_=0;
    while(++case_)
    {
        cout<<"case "<<case_<<":"<<endl;
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        init(pla);//初始化,这个操作一定要有
        init(plb);
        init(plc);
        ch='0';
        cout<<"input A poly:";
        while(ch!='\n')//A表达式的输入
        {
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
            ch=getchar();
            A[_exp]=_ceof;
            adegree=_exp;
        }
        input(pla,adegree,A);
        cout<<"input B poly:";
           ch='0';
        while(ch!='\n')//B表达式的输入
        {
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
            ch=getchar();
            B[_exp]=_ceof;
            bdegree=_exp;
        }
        input(plb,bdegree,B);
        mul_poly(pla,plb,plc);
        output(plc);//输出最终结果
        cout<<"insert one formula to the poly:";
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
        insert_poly(plc,_ceof,_exp);
        output(plc);//输出插入一项后的最终结果
        cout<<endl;
    }
}
View Code

 

转载于:https://www.cnblogs.com/acm-jing/p/4418266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用C语言链表实现多项式乘法,首先需要定义一个多项式的结构体,其中包含多项式的系数和指数。然后可以通过创建链表的方式存储多项式。 下面是一个示例代码,实现多项式乘法的函数: ```c #include <stdio.h> #include <stdlib.h> // 定义多项式节点结构体 typedef struct PolynomialNode { int coefficient; // 系数 int exponent; // 指数 struct PolynomialNode* next; // 下一个节点指针 } PolynomialNode; // 创建多项式节点 PolynomialNode* createNode(int coefficient, int exponent) { PolynomialNode* node = (PolynomialNode*)malloc(sizeof(PolynomialNode)); node->coefficient = coefficient; node->exponent = exponent; node->next = NULL; return node; } // 在链表末尾插入节点 void insertNode(PolynomialNode** head, int coefficient, int exponent) { PolynomialNode* newNode = createNode(coefficient, exponent); if (*head == NULL) { *head = newNode; } else { PolynomialNode* curr = *head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } } // 打印多项式 void printPolynomial(PolynomialNode* head) { PolynomialNode* curr = head; while (curr != NULL) { printf("%dx^%d ", curr->coefficient, curr->exponent); curr = curr->next; if (curr != NULL) { printf("+ "); } } printf("\n"); } // 多项式乘法 PolynomialNode* multiplyPolynomials(PolynomialNode* poly1, PolynomialNode* poly2) { PolynomialNode* result = NULL; PolynomialNode* curr1 = poly1; while (curr1 != NULL) { PolynomialNode* curr2 = poly2; while (curr2 != NULL) { int coefficient = curr1->coefficient * curr2->coefficient; int exponent = curr1->exponent + curr2->exponent; insertNode(&result, coefficient, exponent); curr2 = curr2->next; } curr1 = curr1->next; } return result; } // 释放链表内存 void freeList(PolynomialNode* head) { PolynomialNode* curr = head; while (head != NULL) { head = head->next; free(curr); curr = head; } } int main() { PolynomialNode* poly1 = NULL; PolynomialNode* poly2 = NULL; // 多项式1: 3x^2 + 4x^1 + 2x^0 insertNode(&poly1, 3, 2); insertNode(&poly1, 4, 1); insertNode(&poly1, 2, 0); // 多项式2: 2x^2 + 5x^0 insertNode(&poly2, 2, 2); insertNode(&poly2, 5, 0); printf("多项式1:"); printPolynomial(poly1); printf("多项式2:"); printPolynomial(poly2); PolynomialNode* result = multiplyPolynomials(poly1, poly2); printf("乘法结果:"); printPolynomial(result); // 释放内存 freeList(poly1); freeList(poly2); freeList(result); return 0; } ``` 运行上述代码,即可实现多项式乘法。代码中通过创建链表的方式存储多项式,然后使用两重循环遍历两个链表,并将乘积的结果插入到一个新的链表中。最后打印新链表中的多项式结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值