测试数据(这里只测试了一组数据,小伙伴们可以自行测试其他数据喔)

2 2 3 3 4 4 0 0
1 2 2 2 0 0

1 2 1 1 0 0 
1 2 1 3 0 0

-1 2 -5 3 -4 2 0 0 
2 3 -4 2 -3 6 0 0

2 2 4 4 3 3 6 6 5 5 0 0 
8 7 4 5 6 1 1 3 3 5 0 0

1 2 3 4 5 6 7 8 0 0 
2 2 4 4 6 6 8 8 0 0

1 2 3 4 5 6 7 8 0 0
1 1 3 3 5 5 7 7 0 0

这里插入链表使用的是尾插法

加减法(其实减法和加法的思路差不多,都是判断指数相同与否,然后对系数实现加减法)

乘法主要是遍历两遍链表(因为一个多项式中每一项都要乘一遍另一个多项式的每一项,因此需要遍历两遍),系数相乘,指数相加

合并同类项(主要采用了迭代的思想,用head保存p1节点的下一节点,这样在p2遍历完后还可以回到p1的下一加点处)

打印多项式(只需要判断第一项的正负就可以啦,后面的都可以直接遍历)

​
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
struct node {int exp;//指数int coe;//系数struct node *next;
} ;
typedef struct node *List;struct node *create();
struct node *insert(List L);
struct node *add(List L1,List L2,List L3);
struct node *sub(List L1,List L2,List L3);
struct node *mul(List L1,List L2,List L3);
void print(List L);
List merge(List L);int main() {List L1=create();List L2=create();List L3;printf("请输入多项式1(输入以0 0为结尾):\n");insert(L1);printf("多项式1为:\n");print(merge(L1));printf("\n");printf("请输入多项式2(输入以0 0为结尾):\n");insert(L2);printf("多项式2为:\n");print(merge(L2));printf("\n");printf("相加后的多项式为:\n");print(add(L1,L2,L3));printf("\n");printf("相减后的多项式为:\n");print(sub(L1,L2,L3));printf("\n");printf("相乘后的多项式为:\n");print(merge(mul(L1,L2,L3)));printf("\n");
}//初始化链表
struct node *create() {List head=(List)malloc(sizeof(struct node));if(head!=NULL) {head->coe=0;head->exp=0;head->next=NULL;}return head;
}
//插入链表
struct node *insert(List L) {List s,t;int e,c;int count=0;t=L;scanf("%d %d",&c,&e);while(e!=0&&c!=0) {if(c<0){count++;}s=(List)malloc(sizeof(struct node));s->coe=c;s->exp=e;s->next=NULL;t->next=s;t=s;scanf("%d %d",&c,&e);}printf("系数为负的个数为:%d\n",count);return L;
}
//加法
struct node *add(List L1,List L2,List L3) {List a=L1;List b=L2;List t;struct node *s;L3=(List)malloc(sizeof(struct node));L3->next=NULL;t=L3;//同时输入了L1,L2链表while(a->next!=NULL&&b->next!=NULL) {if(a->next->exp==b->next->exp) {s=(List)malloc(sizeof(struct node));//创建一个新节点存放L1与L2相加后的数据s->coe=a->next->coe+b->next->coe;s->exp=a->next->exp;s->next=NULL;t->next=s;t=s;a=a->next;b=b->next;} else if(a->next->exp < b->next->exp) {s=(List)malloc(sizeof(struct node));s->coe=a->next->coe;s->exp=a->next->exp;s->next=NULL;t->next=s;t=s;a=a->next;} else  {s=(List)malloc(sizeof(struct node));s->coe=b->next->coe;s->exp=b->next->exp;s->next=NULL;t->next=s;t=s;b=b->next;}}//只输入了L1链表while(a->next!=NULL) {s=(List)malloc(sizeof(struct node));s->coe=a->next->coe;s->exp=a->next->exp;s->next=NULL;t->next=s;t=s;a=a->next;}//只输入了L2链表while(b->next!=NULL) {s=(List)malloc(sizeof(struct node));s->coe=b->next->coe;s->exp=b->next->exp;s->next=NULL;t->next=s;t=s;b=b->next;}return L3;
}
//减法
struct node *sub(List L1,List L2,List L3) {List a=L1;List b=L2;List t;struct node *s;L3=(List)malloc(sizeof(struct node));L3->next=NULL;t=L3;//同时输入了L1,L2链表while(a->next!=NULL&&b->next!=NULL) {if(a->next->exp==b->next->exp) {s=(List)malloc(sizeof(struct node));//创建一个新节点存放L1与L2相加后的数据s->coe=a->next->coe-b->next->coe;s->exp=a->next->exp;s->next=NULL;if(s->coe==0) {free(s);}t->next=s;t=s;a=a->next;b=b->next;} else if(a->next->exp < b->next->exp) {s=(List)malloc(sizeof(struct node));s->coe=a->next->coe;s->exp=a->next->exp;s->next=NULL;t->next=s;t=s;a=a->next;} else  if(a->next->exp > b->next->exp) {s=(List)malloc(sizeof(struct node));s->coe=-b->next->coe;s->exp=b->next->exp;s->next=NULL;t->next=s;t=s;b=b->next;}}//只输入了L1链表while(a->next!=NULL) {s=(List)malloc(sizeof(struct node));s->coe=a->next->coe;s->exp=a->next->exp;s->next=NULL;t->next=s;t=s;a=a->next;}//只输入了L2链表while(b->next!=NULL) {s=(List)malloc(sizeof(struct node));s->coe=b->next->coe;s->exp=b->next->exp;s->next=NULL;t->next=s;t=s;b=b->next;}return L3;
}
//乘法
struct node *mul(List L1,List L2,List L3) {List a,b,t,head;a=L1->next;b=L2->next;head=L2->next;struct node *s;L3=(List)malloc(sizeof(struct node));L3->next=NULL;t=L3;while(a!=NULL) {while(b!=NULL) {s=(List)malloc(sizeof(struct node));//辅助节点,暂时存储数据 s->coe=a->coe*b->coe;s->exp=a->exp+b->exp;s->next=NULL;t->next=s;t=s;b=b->next;}a=a->next;b=head;//b链表返回第一个多项式 }return L3;
}
//多项式合并同类项
List merge(List L) {List p1,p2,temp,head;p1=L->next;while(p1!=NULL) {p2=p1->next;head=p1->next;while(p2!=NULL) {if(p1->exp==p2->exp) {p1->coe=p1->coe+p2->coe;temp=p2;p1->next=p2->next;free(temp);p2=p1->next;} else {p2=p2->next;}}p2=head;//让p2回到 p1节点的下一个节点处 p1=p1->next;}return L;
}
//打印多项式
void print(List L) {List p;p=L;if(p->next->coe>0) {printf("%dx^%d",p->next->coe,p->next->exp);p = p->next;}while ( p->next!=NULL) {if(p->next->coe>0) {printf("+%dx^%d",p->next->coe,p->next->exp);p = p->next;} else if(p->next->coe<0) {printf("%dx^%d",p->next->coe,p->next->exp);p = p->next;}}
}​

数据结构——多项式的加减乘法以及合并同类项的算法相关推荐

  1. bigdecimal保留4位小数_四年级数学小数的加减乘法知识点汇总,带练习!

    张老师 - 4年级(多品小学教育) 顺城中心小学郭老师和环县虎洞中心小学谭老师需要的这份学习资料现在分享. 本资料已制作电子版 下载码是:76qa32vd <小数的加减乘法>知识点 一.小 ...

  2. 矩阵的加减乘c语言程序,C语言实现的矩阵加减乘法运算系统

    C语言实现的矩阵加减乘法运算系统 /*本矩阵运算系统可以完成矩阵的加.减.乘法,但是只限于方阵*/ #include<stdio.h> #include<math.h> /*- ...

  3. 【数据结构与算法】之深入解析“分数加减运算”的求解思路与算法示例

    一.题目要求 给定一个表示分数加减运算的字符串 expression,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换 ...

  4. 高精度加减乘法小程序

    复习高精度玩,写了个非常直观的加减乘程序. 1 Uses Math; 2 Var 3 a,b:AnsiSTring; 4 DC,la,lb:longint; 5 c:Array[-2555555..2 ...

  5. 矩阵加 减 乘法的C语言实现

    矩阵的加减法:就是对应位置相加减即可 对于满足以下条件的矩阵A,B: 我们有: 加法, 减法, 矩阵的乘法: 对于满足以下条件的矩阵A,B,C: 我们有: 其中: 要注意的是矩阵群没有乘法交换律,也就 ...

  6. 实例82 复数的加减乘法

    #include<stdio.h> #include <stdlib.h> #include<string.h> typedef struct MyComplex ...

  7. 数据结构(C语言)多项式加减

    这是大二刚开始数据结构的平时作业,上次随便发了,没来得及写标题和内容.题目要求用链表来实现多项式的加减,其实就是设置一个两个指针进行遍历,在代码段里有一些注解,要是有不太清楚的地方可以在下面留言或是私 ...

  8. 二元多项式基本运算 选择合适的存储结构表示二元多项式,并实现基本的加减运算 要求: 1)二元多项式的输入采用如下方式进行键盘输入 (5y^2+7)x^4 + (3y^4+2y+9)x^2 + (2y

    1. 本题最关键的部分就是指数和系数的读取和存储,可以把系数和指数存在一个N*4的数列中,第一列为系数,第二列为x的指数,第三列为y的指数,第四列可有可无,第四列可以存储两个指数的和,方便升幂和降幂. ...

  9. [MATLAB]多项式求导/加减/乘除

    函数公式: 多项式的加减运算 多项式的加减运算非常简单,即相应向量相加减 多项式乘法 conv(p1,p2):多项式相乘函数.在这里,P1.P2是两个多项式系数向量 多项式除法 [Q,r]=decon ...

最新文章

  1. jquery的$.extent()方法的总结
  2. 软件测试第二次作业:JUNIT单元测试方法
  3. 五指CMS发布,主打高性能
  4. 快手用旺旺瓶子做机器人_用罐头瓶子做醪糟容易做好保存
  5. 华为手机下拉菜单没了_这才是华为正确的截图方式!别不当回事,白白浪费这么强大的手机...
  6. [Hibernate系列—] 1. 下载与试用Hibernate(MySQL与Oracle 配置)
  7. Android混淆和加固详解
  8. linux伪造ip数据包,伪造ICMP数据包的IP层
  9. Linux 安装mongodb数据库
  10. 《有限单元法》--王勖成,习题2.12 MATLAB 程序
  11. match函数的用法
  12. STM32单片机中定义结构体类型指针
  13. ArcGIS影像多种裁剪方法
  14. 各行业的龙头股 (整理)
  15. vscode实用快捷键_23个常用的VSCode快捷键(动图演示)
  16. WA47电子管麦克风
  17. 我的Security+601备考经验分享
  18. FILCO Majestouch Convertible 2 键盘连接电脑说明
  19. 实现汽车租赁系统的计价功能
  20. LibreCAD for windows 编译

热门文章

  1. R语言计算数值的反对数(antilog,antilogarithm)实战
  2. 英语学习得建议和忠告 附送下载资料无数
  3. QT调试的时候提示not in executable format:file format not recognized
  4. nexus是java的插件吗_Nexus3 OSS环境搭建以及在日常工作中的用途
  5. Wireshark下载安装教程
  6. TI Lab_SRR学习_1 硬件基础 AWR1642和AWR1642EVM
  7. Qt开发笔记(一):Qt+FFmpeg开发环境搭建以及工程模板
  8. vex夹球机器人_Vex机器人软件使用说明书
  9. Stan:一种统计学建模语言
  10. 2022第五届中国(济南)国际眼科医学及眼科医疗设备展览会