实现两个多项式加法

目录

    • 题目计算两个一元多项式之和
    • 代码逻辑
    • 数据结构
    • 合并同类项
    • 合并两个式子
    • 主函数逻辑
    • 运行结果
  • 代码

题目计算两个一元多项式之和

例子:

f ( x ) = 2 x 3 + 9 x 6 + 2 x 8 f(x)= 2x^3 + 9 x^6+2x^8 f(x)=2x3+9x6+2x8

+
f ( x ) = 7 x 3 − 3 x 6 − 2 x 8 f(x)= 7x^3 - 3 x^6-2x^8 f(x)=7x3−3x6−2x8

=

f ( x ) = 9 x 3 − 6 x 6 f(x)= 9x^3 - 6 x^6 f(x)=9x3−6x6

代码逻辑

  1. 收集两个链表的次方和系数
  2. 依据次方来合并两个链表
  3. 遍历输出合并结果

数据结构

数据结构是线性表的链表

typedef struct{int cifang;//次方 float xishu;//系数
} Elemtype;
typedef struct LNode{Elemtype data;struct LNode *next;
}LNode;//定义链表结点typedef int Statu;typedef struct {LNode  *head;int lenth;//记录几个元素
}LinkList;//定义链序表类型

链表结构:

合并同类项

按照次方从小到大的顺序插入项
插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项

把新来的元素找到合适的位置,如果有同类项,则直接合并;如果没有就把他作为新元素插入已经找到的合适位置

Statu PolyInsert_Link(LinkList *mylist, Elemtype elem){//按照次方从小到大的顺序插入项//插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项int i = 1;Statu flag;LNode *pre = mylist->head, *cur = pre->next;for(; cur != NULL && cur->data.cifang < elem.cifang;){i++;pre = pre->next;cur = cur->next;} if(cur != NULL&&cur->data.cifang == elem.cifang){cur->data.xishu += elem.xishu;return OK;}else{flag=Insert_LinkList(mylist, i, elem);//把elem插入到mylist return flag;}
}

这是插入函数,需要合适的位置即(int i)和要插入的元素(Elemtype elem)

 Statu Insert_LinkList(LinkList *mylist, int i, Elemtype elem){//在顺序表第i个位置(从1开始数)插入元素//请填入代码。int j;LNode *pre = mylist->head, *cur = NULL;cur = (LNode *)malloc(sizeof(LNode));if(!cur){return ERROR;}cur->data.cifang = elem.cifang;cur->data.xishu = elem.xishu;if(i<0 || i>mylist->lenth+1){return ERROR;}for(j = 1; j<i; j++){pre = pre->next;}cur->next = pre->next;pre->next = cur;mylist->lenth++;return OK;}

合并两个式子

使用GetElem_LinkList(mypoly2, i, &elem)函数从另一个多项式B中获得一个元素
再将获得的元素使用合并同类项的方法PolyInsert_Link(mypoly1, elem);将元素按照从小到大的顺序插入到多项式A中

void Add_Poly_Link(LinkList *mypoly1,LinkList mypoly2){//将多项式2中的项依次插入多项式1中int i;Elemtype elem;for(i = 1; i <= mypoly2.lenth; i++){GetElem_LinkList(mypoly2, i, &elem);PolyInsert_Link(mypoly1, elem);}
}

遍历B中每一个元素,将其合并到A中

主函数逻辑

  1. 创建两个空链表,用户输入信息后打印两个链表
  2. 将两个链表相加合并为一个链表
  3. 打印合并后的链表
  4. 销毁两个链表
int main() {LinkList polyA, polyB;Create_Poly_LinkList(&polyA);Create_Poly_LinkList(&polyB);Show_Poly_Link(polyA);printf("\n+\n");Show_Poly_Link(polyB);Add_Poly_Link(&polyA,polyB);printf("\n=\n");Show_Poly_Link(polyA);Destroy_LinkList(&polyA);Destroy_LinkList(&polyB);return 0;
}

运行结果

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct{int cifang;//次方 float xishu;//系数
} Elemtype;
typedef struct LNode{Elemtype data;struct LNode *next;
}LNode;//定义链表结点typedef int Statu;typedef struct {LNode  *head;int lenth;//记录几个元素
}LinkList;//定义链序表类型Statu Init_LinkList(LinkList * mylist){//顺序表初始化mylist->head = (LNode  *)malloc(sizeof(LNode));//头结点if(!mylist->head){return ERROR;}mylist->head->next = NULL;mylist->lenth = 0; return OK;
}void Destroy_LinkList(LinkList * mylist){//销毁顺序表LNode * p = NULL;while(mylist->head != NULL){p = mylist->head;mylist->head = p->next;free(p);}mylist->lenth = 0;
}Statu Insert_LinkList(LinkList *mylist, int i, Elemtype elem){//在顺序表第i个位置(从1开始数)插入元素//请填入代码。int j;LNode *pre = mylist->head, *cur = NULL;cur = (LNode *)malloc(sizeof(LNode));if(!cur){return ERROR;}cur->data.cifang = elem.cifang;cur->data.xishu = elem.xishu;if(i<0 || i>mylist->lenth+1){return ERROR;}for(j = 1; j<i; j++){pre = pre->next;}cur->next = pre->next;pre->next = cur;mylist->lenth++;return OK;}
Statu Delete_LlinkList(LinkList *mylist, int i, Elemtype *elem){//删除链表第i个结点,并把值传给elem//请填入代码int j;LNode *pre = mylist->head, *cur = NULL;if(i < 0 || i>mylist->lenth){return ERROR;}for(j = 1; j<i; j++){pre = pre->next;}cur = pre->next;pre->next = cur->next;elem->cifang = cur->data.cifang;elem->xishu = cur->data.xishu;free(cur);mylist->lenth--;return OK;
}Statu GetElem_LinkList(LinkList mylist, int i, Elemtype * elem){int j;LNode *cur = mylist.head;if(i>0&&i<=mylist.lenth){for(j = 1; j<=i; j++){ cur = cur->next;}(*elem).cifang = cur->data.cifang;(*elem).xishu  = cur->data.xishu;return OK;}else {return ERROR;}
}
Statu Init_Poly_LinkList(LinkList *mylist){if(!Init_LinkList(mylist)){return ERROR;}return OK;
}Statu PolyInsert_Link(LinkList *mylist, Elemtype elem){//按照次方从小到大的顺序插入项//插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项int i = 1;Statu flag;LNode *pre = mylist->head, *cur = pre->next;for(; cur != NULL && cur->data.cifang < elem.cifang;){i++;pre = pre->next;cur = cur->next;}   if(cur != NULL&&cur->data.cifang == elem.cifang){cur->data.xishu += elem.xishu;return OK;}else{flag=Insert_LinkList(mylist, i, elem);//把elem插入到mylist return flag;}
}Statu Create_Poly_LinkList(LinkList *mylist){int n = 0, i;int cifang;float xishu;Statu flag;Elemtype e;flag = Init_Poly_LinkList(mylist);if(flag){printf("请输入多项式的项数n = ");scanf("%d", &n);for(i = 0; i < n; i++){printf("第%5d项的幂次是", i+1);scanf("%d", &cifang);printf("第%5d项的系数是", i+1);scanf("%f", &xishu);e.cifang = cifang;e.xishu = xishu;PolyInsert_Link(mylist, e);}return OK;}return ERROR;
}void Add_Poly_Link(LinkList *mypoly1,LinkList mypoly2){//请填入代码。提示,将多项式2中的项依次插入多项式1中int i;Elemtype elem;for(i = 1; i <= mypoly2.lenth; i++){GetElem_LinkList(mypoly2, i, &elem);PolyInsert_Link(mypoly1, elem);}
}
void Show_Poly_Link(LinkList mypoly){//打印多项式int flag = 0;LNode * cur = mypoly.head->next;printf("f(x) = ");if(mypoly.lenth == 0){printf("0");}else{while(cur){if(flag != 0){printf(" + ");}else{flag++;}printf("%0.2fx^%d", cur->data.xishu,cur->data.cifang);cur = cur->next;}}printf("\n");
}
int main() {LinkList polyA, polyB;Create_Poly_LinkList(&polyA);Create_Poly_LinkList(&polyB);Show_Poly_Link(polyA);printf("\n+\n");Show_Poly_Link(polyB);Add_Poly_Link(&polyA,polyB);printf("\n=\n");Show_Poly_Link(polyA);Destroy_LinkList(&polyA);Destroy_LinkList(&polyB);return 0;
}

实现两个一元多项式加法相关推荐

  1. PTA 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。

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

  2. 一元多项式加法c语言,C语言一元多项式加法.doc

    C语言一元多项式加法 //C语言数据结构_一元多项式加法#include #include #include #define OK 1#define ERROR 0typedef int Status ...

  3. 不使用加减乘除法,完成两个数的加法

    #include "stdio.h" //不使用加减乘除法,完成两个数的加法int addwei(int num1,int num2) {if(num2==0) return nu ...

  4. JS中有两种自加法操作

    JS中有两种自加法操作.它们的运算符是++,它们的函数是向1添加运算符. 我和我的区别在于操作的顺序和组合的方向. 其中: ++var被称为预自动添加,变量执行自动添加操作后.它的操作是先执行自动加法 ...

  5. java用流体加减乘除_任意输入两个数,完成加法、减法、乘法、除法运算!(加减乘除运算分别定义四个方法)_学小易找答案...

    [简答题]编写程序实现菜单设计 [简答题]一层平面图 [简答题]编写一个程序实现大小写字母转换 [简答题]利用循环语句输出一个五行的等腰三角形,如下图 [简答题]编写一个程序实现交换两个变量的数值. ...

  6. 两个一元多项式求和(新)(C语言)

    [问题描述]编写一个程序实现两个一元多项式相加的运算. #include<stdio.h> int main() {int i,a[51]={0},s,t,m,n;scanf(" ...

  7. C语言数组求两个一元多项式,【C/C++】两个一元多项式求和(新)

    这些题目都是大一刚入学时学习C语言的课后作业,在OJ上看到还保留着,就都整理下发出来吧......(只有题和代码) [问题描述]编写一个程序实现两个一元多项式相加的运算. [输入形式]从标准输入中读入 ...

  8. 编写一个程序实现两个一元多项式相加的运算。

    [问题描述]编写一个程序实现两个一元多项式相加的运算. [输入形式]从标准输入中读入四行数据, 其中第一行和第三行:各是是一个整数,表示第二行和第四行数据的个数: 第二行和第四行是若干个以空格分隔的整 ...

  9. c语言 两个一元多项式的乘法,一元多项式的加法、减法、乘法和微分运算的C语言链表结构算法实现...

    问题描述: 利用链表实现一元多项式的数学运算.如一元多项式 可以利用其系数

最新文章

  1. 深入理解openstack网络架构(2)----Basic Use Cases
  2. 10.24T3 解方程 取模意义下运算+秦九韶算法
  3. 战友!6.19决战光荣日,一个真实的魔兽世界在等你!
  4. Redis设计于实现之字典
  5. testflight开发者已将您从测试计划中移除_使用 TestFlight 测?试 App
  6. 前端学习(2422):反馈
  7. 单例设计模式之安全的懒汉式
  8. php lpop 返回null,数据库读取数据返回 null 怎么办?
  9. 图解JVM内存三大核心区域及其JVM内存案例实战剖析
  10. Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
  11. 四阶龙格库塔法 matlab ode45,微分方程的数值解法matlab(四阶龙格—库塔法)
  12. 向已知EXCEL模板写入数据并导出
  13. 简单使用触发器(详细) SQL触发器的使用及语法
  14. 带你入门Java网络爬虫
  15. OpenCV目标追踪
  16. 基于android的外卖在线订餐系统app
  17. Spring Boot 使用 Swagger3 生成 API 接口文档
  18. Xamarin iOS 让图片动起来,做一个简单的俄罗斯轮盘
  19. HTML+CSS系列学习:重生之我要精通编程语言修仙
  20. 【信息系统项目管理师】第十四章 文档与配置管理思维导图

热门文章

  1. MySQL阶段性知识学习总结(一)
  2. “虫二“ - 风月无边
  3. C# SolidWorks 二次开发 API --- 2018版 中文翻译 ModelDoc2 属性和IModelDocExtension属性
  4. Docker_用Dockerfile构建自己的tomcat
  5. 标记蛋白抗体多肽1267539-32-1,Cyanine5 azide,花青素CY5叠氮,知识点梳理
  6. Java漫谈---Java中的初始化
  7. 关于Chrome浏览器总提示未安装flash player解决办法
  8. 米兔机器人重置_米兔机器人上手组装如果你不会拼装或拆卸建议收藏
  9. Number类型详解
  10. ORACLE number类型转换