#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Node
{
    int coef;//系数
    int exp;//指数
    struct Node *next;
}PolyNode;

PolyNode *Creatpoly()//创建多项式的单链表,尾插法
{
    PolyNode *h,*p,*q;
    h=(PolyNode *)malloc(sizeof(PolyNode));//链表头结点
    p=h;
    p->next=NULL;
    printf("please input the Polyomial coef & exp a,b,when input 0 stop\n");
    q=(PolyNode *)malloc(sizeof(PolyNode));
    scanf("%d,%d",&q->coef,&q->exp);
    while(q->coef!=0)
    {
        p->next=q;
        p=q;
        q=(PolyNode *)malloc(sizeof(PolyNode));
        scanf("%d,%d",&q->coef,&q->exp);
    }
    p->next=NULL;
    return(h);
}

void Prin_poly(PolyNode *h)//将多项式输出函数
{
    PolyNode *p;
    p=h->next;
    while(p!=NULL)
    {
        if(p->coef>0&&p!=h->next)
        {
            if(p->exp>0)
                printf("+%dx^%d",p->coef,p->exp);
            else if(p->exp<0)
                printf("+%dx^(%d)",p->coef,p->exp);
            else
                printf("+%d",p->coef);
        }
        else if(p->coef<0&&p!=h->next)
        {
            if(p->exp>0)
                printf("%dx^%d",p->coef,p->exp);
            else if(p->exp<0)
                printf("%dx^(%d)",p->coef,p->exp);
            else
                printf("%d",p->coef);
        }
        else
        {
            if(p->exp>0)
                printf("%dx^%d",p->coef,p->exp);
            else if(p->exp<0)
                printf("%dx^(%d)",p->coef,p->exp);
            else
                printf("%d",p->coef);
        }
        p=p->next;
       }
}

void Insort(PolyNode *h)//排序函数,使多项式中的各项按X的升幂排列
{
    PolyNode *s,*p;
    int t,m;
    for(p=h->next;p!=NULL;p=p->next)//类似于冒泡排序
    {
        for(s=h->next;s->next!=NULL;s=s->next)
        {
            if(s->exp>s->next->exp)
            {
                t=s->exp;
                m=s->coef;
                s->coef=s->next->coef;
                s->exp=s->next->exp;
                s->next->coef=m;
                s->next->exp=t;
            }
        }
    }
}

void UnitePoly(PolyNode *h)//合并同类项
{
    PolyNode *p1,*p2,*q1,*q2,*temp;
    q1=h;
    p1=q1->next;
    while(p1!=NULL)
    {
        p2=p1->next;
        q2=p1;
        while(p2!=NULL)
        {
            if(p1->exp==p2->exp)
            {
                p1->coef=p1->coef+p2->coef;
                if(p1->coef==0)
                {
                    temp=p2;
                    q2->next=p2->next;
                    free(temp);
                    temp=p1;
                    q1->next=p1->next;
                    p1=q1;
                    free(temp);
                    break;
                }
                else
                {
                    temp=p2;
                    q2->next=p2->next;
                    p2=p2->next;
                    free(temp);
                }
            }
            else
            {
                q2=p2;
                p2=p2->next;
            }
        }
        q1=p1;
        p1=p1->next;
    }
}

PolyNode *polymuti(PolyNode *h1,PolyNode *h2)//多项式相乘
{
    PolyNode *h,*p,*p1,*p2,*q;
    p1=h1->next;
    h=p=(PolyNode *)malloc(sizeof(PolyNode));
    p->next=NULL;
    while(p1)
    {
        p2=h2->next;
        while(p2)
        {
            q=(PolyNode *)malloc(sizeof(PolyNode));
            q->coef=p1->coef*p2->coef;
            q->exp=p1->exp+p2->exp;
            p->next=q;
            p=q;
            p2=p2->next;
        }
        p1=p1->next;
    }
    p->next=NULL;
    return(h);
}
int main()
{
    PolyNode *h1,*h2,*h;
    h1=Creatpoly();
    printf("the Polyomial is P1(x)=");
    UnitePoly(h1);
    Insort(h1);
    Prin_poly(h1);
    printf("\n");
    h2=Creatpoly();
    printf("the Polyomial is P2(x)=");
    UnitePoly(h2);
    Insort(h2);
    Prin_poly(h2);
    printf("\n");
    printf("press any key to check the result\n");
    getch();
    printf("after multi the result is P(x)=");
    h=polymuti(h1,h2);
    UnitePoly(h);
    Insort(h);
    Prin_poly(h);
    printf("\n");
    return 0;
}

C语言实现一元多项式求积的更多相关文章

  1. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  2. 链表一元多项式计算器的实现(Java语言描述)

    链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进. 代码如下: package 一元多项式计算器; public class PolyNode { private double a; ...

  3. 1010 一元多项式求导 (25 分) C语言

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  4. 一元多项式的乘法与加法运算(C语言)

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

  5. 一元多项式Polynomial的C语言实现

    /* 编译器:Dev-c++ 5.4.0 文件名:Polynomial.cpp 代码版本号:1.0 时间:2015年10月9日21:53:26 */ /* 总结: 1.结构体指针指向的区域要手动分配内 ...

  6. 基于visual Studio2013解决C语言竞赛题之0613递归求积

     题目

  7. 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)

    数学中一元n次多项式可表示成如下的形式:  Pn(x)=p0+p1x+p2x^2+…+pnx^n     (最多有 n+1 项,n +1 个系数唯一确定她)      (1)请设计一套接口用以表示和操 ...

  8. C语言细节总结笔记

    C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...

  9. 【编程练习】收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等

    写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...

随机推荐

  1. 【算法笔记】B1048 数字加密

    1048 数字加密 (20 分) 本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 ...

  2. hql语句加别名的错误

    写了一个查询数量的方法,结果执行不出来,debug后是runtimeException,然后就在那个hql里面使劲找,将他翻译成sql在数据库中执行,结果也没问题,原来的hql如下: 注意这个num, ...

  3. C# 一些请求的基类(待补充)

    using System.Runtime.Serialization; /// <summary> /// 通用分页请求类 /// </summary> [DataContra ...

  4. 人生苦短,我用pycharm

    一.安装 1.首先到官网上下载正版,然后点击安装,只需要更改下面一个地方即可 2.激活码或者帐号的话,可以去百度搜,也可以去某宝买,也就3块钱(一年),不建议使用破解版,如果你真的差这三块钱的话,你还 ...

  5. git 代码统计

    查看git上的个人代码提交量: git log --author="Marek Romanowski" --since="2019-01-01" --no-me ...

  6. PIE SDK矢量数据简单渲染

    1. 功能简介 PIE SDK对数据的符号化分为矢量数据渲染和栅格数据渲染两大类. 目前PIE SDK中针对矢量数据渲染包括简单渲染.唯一值渲染.分级渲染.自定义渲染:针对栅格数据渲染包括拉伸渲染.R ...

  7. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  8. oracle 基础知识(七)----动态性能视图

    一,动态性能视图介绍 动态性能视图属于数据字典,系统管理员用户 SYS 可以访问它们.在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关.虽然这些视图很像普通的数据库表,但它们不允许用户直 ...

  9. 剑指offer第3题:从尾到头打印链表

    方法一:采用栈来存储,用ArrayList保存.注意题目给出的输出结果是ArrayList import java.util.ArrayList; import java.util.Stack; pu ...

  10. URLEncoder.encode问题

    遇到java里的URLEncoder.encode方法编码后与javascript的encodeURIComponent方法的结果有点不一样,找了一下资料,原来URLEncoder实现的是HTML形式 ...