#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. git 各个区的区别

    Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited) 把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用 git add 把文 ...

  2. [转] PuTTY + Xming 远程使用 Linux GUI

    [From] http://www.zw1840.com/blog/zw1840/2008/10/putty-xming-linux-gui.html By zw1840 on October 28, ...

  3. Flutter 导入 import 'package:english_words/english_words.dart'

    import 'package:flutter/material.dart';import 'package:english_words/english_words.dart'; // 导入的包 vo ...

  4. PIE SDK图层属性

    1. 功能简介 通过查看图层属性可以对图层的基本信息(一般信息,来源,注释,字段信息等)有所了解 ,下面就基于PIE SDK,介绍查看图层属性功能的实现. 2. 功能实现说明 2.1. 实现思路及原理 ...

  5. JS及Dom练习 | 模态对话框及复选框操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Lua初探

      官方网站:http://www.lua.org/ 三方模块:https://luarocks.org/ 介绍安装luarocks语法注释标示符关键字全局变量数据类型变量赋值索引循环流程控制函数可变 ...

  7. sqlplus连接oracle语法

    sqlplus文件在product\11.2.0\dbhome_1\BIN目录下. 连接语法:用户名/密码@ip/服务名

  8. AutoMagic自动化测试平台简介

    PS:给想做自动化平台同学一点思路. AutoMagic 是一个基于WebUI的自动化管理平台.为什么叫AutoMagic呢?因为自动化(Automation)在执行起来的时候是一个很神奇的事情,它可 ...

  9. 九度oj题目1385:重建二叉树

    题目1385:重建二叉树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4419 解决:1311 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和 ...

  10. springboot 之 使用jetty web容器

    springboot 中默认的web容器是tomcat. 在maven 的pom 文件中加入如下依赖,便可使用tomcat 容器. <dependency> <groupId> ...