实现两个一元多项式加法
实现两个多项式加法
目录
- 题目计算两个一元多项式之和
- 代码逻辑
- 数据结构
- 合并同类项
- 合并两个式子
- 主函数逻辑
- 运行结果
- 代码
题目计算两个一元多项式之和
例子:
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
代码逻辑
- 收集两个链表的次方和系数
- 依据次方来合并两个链表
- 遍历输出合并结果
数据结构
数据结构是线性表的链表
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中
主函数逻辑
- 创建两个空链表,用户输入信息后打印两个链表
- 将两个链表相加合并为一个链表
- 打印合并后的链表
- 销毁两个链表
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;
}
实现两个一元多项式加法相关推荐
- PTA 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。
设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...
- 一元多项式加法c语言,C语言一元多项式加法.doc
C语言一元多项式加法 //C语言数据结构_一元多项式加法#include #include #include #define OK 1#define ERROR 0typedef int Status ...
- 不使用加减乘除法,完成两个数的加法
#include "stdio.h" //不使用加减乘除法,完成两个数的加法int addwei(int num1,int num2) {if(num2==0) return nu ...
- JS中有两种自加法操作
JS中有两种自加法操作.它们的运算符是++,它们的函数是向1添加运算符. 我和我的区别在于操作的顺序和组合的方向. 其中: ++var被称为预自动添加,变量执行自动添加操作后.它的操作是先执行自动加法 ...
- java用流体加减乘除_任意输入两个数,完成加法、减法、乘法、除法运算!(加减乘除运算分别定义四个方法)_学小易找答案...
[简答题]编写程序实现菜单设计 [简答题]一层平面图 [简答题]编写一个程序实现大小写字母转换 [简答题]利用循环语句输出一个五行的等腰三角形,如下图 [简答题]编写一个程序实现交换两个变量的数值. ...
- 两个一元多项式求和(新)(C语言)
[问题描述]编写一个程序实现两个一元多项式相加的运算. #include<stdio.h> int main() {int i,a[51]={0},s,t,m,n;scanf(" ...
- C语言数组求两个一元多项式,【C/C++】两个一元多项式求和(新)
这些题目都是大一刚入学时学习C语言的课后作业,在OJ上看到还保留着,就都整理下发出来吧......(只有题和代码) [问题描述]编写一个程序实现两个一元多项式相加的运算. [输入形式]从标准输入中读入 ...
- 编写一个程序实现两个一元多项式相加的运算。
[问题描述]编写一个程序实现两个一元多项式相加的运算. [输入形式]从标准输入中读入四行数据, 其中第一行和第三行:各是是一个整数,表示第二行和第四行数据的个数: 第二行和第四行是若干个以空格分隔的整 ...
- c语言 两个一元多项式的乘法,一元多项式的加法、减法、乘法和微分运算的C语言链表结构算法实现...
问题描述: 利用链表实现一元多项式的数学运算.如一元多项式 可以利用其系数
最新文章
- 深入理解openstack网络架构(2)----Basic Use Cases
- 10.24T3 解方程 取模意义下运算+秦九韶算法
- 战友!6.19决战光荣日,一个真实的魔兽世界在等你!
- Redis设计于实现之字典
- testflight开发者已将您从测试计划中移除_使用 TestFlight 测?试 App
- 前端学习(2422):反馈
- 单例设计模式之安全的懒汉式
- php lpop 返回null,数据库读取数据返回 null 怎么办?
- 图解JVM内存三大核心区域及其JVM内存案例实战剖析
- Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
- 四阶龙格库塔法 matlab ode45,微分方程的数值解法matlab(四阶龙格—库塔法)
- 向已知EXCEL模板写入数据并导出
- 简单使用触发器(详细) SQL触发器的使用及语法
- 带你入门Java网络爬虫
- OpenCV目标追踪
- 基于android的外卖在线订餐系统app
- Spring Boot 使用 Swagger3 生成 API 接口文档
- Xamarin iOS 让图片动起来,做一个简单的俄罗斯轮盘
- HTML+CSS系列学习:重生之我要精通编程语言修仙
- 【信息系统项目管理师】第十四章 文档与配置管理思维导图
热门文章
- MySQL阶段性知识学习总结(一)
- “虫二“ - 风月无边
- C# SolidWorks 二次开发 API --- 2018版 中文翻译 ModelDoc2 属性和IModelDocExtension属性
- Docker_用Dockerfile构建自己的tomcat
- 标记蛋白抗体多肽1267539-32-1,Cyanine5 azide,花青素CY5叠氮,知识点梳理
- Java漫谈---Java中的初始化
- 关于Chrome浏览器总提示未安装flash player解决办法
- 米兔机器人重置_米兔机器人上手组装如果你不会拼装或拆卸建议收藏
- Number类型详解
- ORACLE number类型转换