一元多项式的加法(c语言版)

我是观看懒猫老师的视频后写的,大家有不懂的可以在评论区留言或者去某站看懒猫老师的视频

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义每个元素的结构
typedef struct polynomial
{int coefficient;//系数int exp;//指数struct polynomial *next;
}*Link,Node;
void inputPoly(Link head);//用于从控制台读入链表的函数
void print(Link head);//打印链表用的函数
bool insert(Link head,int coefficient,int exp);//向链表插入一个元素的函数
void combin2List(Link heada,Link headb,Link headab);//合并两个链表
int main()
{Link headA,headB;//两个多项式的头指针Link headAB;//合并后的多项式的头指针/*链表的初始化 创建头结点*/headA=(Link)malloc(sizeof(Node));headA->next=NULL;headB=(Link)malloc(sizeof(Node));headB->next=NULL;headAB=(Link)malloc(sizeof(Node));headAB->next=NULL;printf("请输入第一个多项式的系数和指数,以(0 0)结束:\n");inputPoly(headA);printf("第一个");print(headA);printf("请输入第二个多项式的系数和指数,以(0 0)结束:\n");inputPoly(headB);printf("第二个");print(headB);combin2List(headA,headB,headAB);printf("合并后");print(headAB);return 0;
}
/**输入二项式数据的函数*/
/*这个函数用来输入二项式,给用户合适的提示,读入用户输入的系数和指数。
调用函数insert,将用户输入的二项式的一项插入到链表中去。*/
void inputPoly(Link head)
{int coefficient,exp;//系数和指数printf("请输入系数和指数(如:\"2 3\"表示2x^3):");scanf("%d %d",&coefficient,&exp); while(coefficient!=0||exp!=0)//连续输入多个系数和指数 {insert(head,coefficient,exp);//调函数输入多项式//     head->next->exp;printf("请输入系数和指数:");scanf("%d %d",&coefficient,&exp);}
}
/**向多项式链表中插入元素的函数
int coefficient 一个多项式项的系数
int exp 一个多项式项的幂
*/
bool insert(Link head,int coefficient,int exp)
{Link node;  //node指针指向新创建的节点Link q,p;   //q,p两个节点一前一后//创建一个新结点node =(Link)malloc(sizeof(Node));node->coefficient=coefficient;node->exp=exp;node->next=NULL;p=head->next;q=head;if(head->next==NULL)//空表,插第1个{head->next=node;}else{while(p != NULL){ //循环访问链表中的所有节点
//p->coefficient;
//p->exp;//如果node节点的指数比p节点的指数大,则插在p的前面,完成插入后,提前退出if(p->exp < node->exp){node->next=q->next;q->next=node;node=NULL;free(node);return true;}//如果node节点的指数和p节点的指数相等,则合并这个多项式节点,提前退出else if(p->exp==node->exp){p->coefficient=p->coefficient+node->coefficient;free(node);return true;}//如果node节点的指数比p节点的指数小,继续向后移动指针(依然保持p,q一前一后)else if(node->exp<p->exp){q=p;p=p->next;}}//如果退出循环是当前指针p移动到链表结尾,则说明之前没有插入,那么当前node节点的指数值是最小值,此时插在链表的最后面q->next=node;node=NULL;free(node);}return true;
}
/*
打印多项式链表的函数
*/
void print(Link head)
{Link p; //指向链表要输出的结点printf("多项式如下:\n");p=head->next; //指向第一个有效节点 if (p == NULL){printf("多项式为空\n");return;}// 不是空表bool isFirstItem=true;//标志是否为第一个节点的flag//打印节点do {//第一步判断符号 //如果是第一项,不用打符号 即为空语句 //如果不是第一项if(!isFirstItem){  if(p->coefficient>0){//系数为正数printf("+");//要打加号}//如果系数为负数,系数自身带有负号也不用打符号 }//第二步判断系数 (只写需要打印的代码,不用打印的内容不用写) //1和-1比较特殊(指定情况下可以省略) if(p->exp==0){//指数为0 if(p->coefficient==1){//系数为1printf("1");//输出1 }else if(p->coefficient==-1){//系数为-1printf("-1");//输出-1 }}//指数不为0 系数为-1(如:-x)  只打印负号if(p->coefficient==-1&&p->exp!=0){printf("-");}//如果系数不为1或-1或0,打印系数else if(p->coefficient!=1&&p->coefficient!=-1&&p->coefficient!=0){//注意系数这部分始终没有输出过1或-1 printf("%d",p->coefficient);}//只有当指数为0时不用打印x 和 指数 //判断x 和 指数 if(p->exp!=0&&p->coefficient!=0){printf("x");//打印x 的条件 指数不为0且系数不为0  if(p->exp!=1){printf("^%d",p->exp);// 打印指数的条件  指数不为0和1 且系数不为0  }}  if(p->coefficient!=0){isFirstItem=false;  //flag标志不是第一项了} p = p->next;//指向下个结点}while(p != NULL);printf("\n");return;
}
/* 合并两个有序链表a,b到链表ab
heada.headb,headab分别为链表a,b,ab的头指针 */
void combin2List(Link heada,Link headb,Link headab){Link pa,pb,pab;//指向a,b链表和ab的指针pa=heada->next;pb=headb->next;pab=headab;while(pa!=NULL&&pb!=NULL)//a,b链表都没有没有访问完毕{//如果指数a>指数b,a节点插入ab链表,a指针后移if(pa->exp>pb->exp){pab->next=pa;pab=pab->next;pa=pa->next;pab->next=NULL;}//如果指数a<指数b,b节点插入ab链表,b指针后移else if(pa->exp<pb->exp){pab->next=pb;pab=pab->next;pb=pb->next;pab->next=NULL;}//如果指数a==指数b,a、b系数相加,插入ab链表,a、b指针后移else if(pa->exp==pb->exp){pa->coefficient=pa->coefficient+pb->coefficient;pab->next=pa;pab=pab->next;pa=pa->next;pb=pb->next;pab->next=NULL;}}//如果a、b链表还有尾巴,将它加到ab链表后面if(pa!=NULL)   {free(headb);free(pb);pab->next=pa;free(heada);pa=NULL;free(pa); }if(pb!=NULL)   {free(heada);free(pa);pab->next=pb;pb=NULL;free(pb);free(headb);}return;
}

一元多项式的加法详解相关推荐

  1. 高精度计算--高精度加法详解

    文章目录 前言 一.高精度加法分析 1.1 数学的竖式加法计算 1.2 数组模拟竖式计算 1.3 计算步骤分析 二.使用步骤 2.1 代码结构 2.2 读入数据并倒置:readDataAndRever ...

  2. 位运算 加法详解

    位运算操作基础 符号 描述 运算规则 & 位与运算 两个位都为1时,结果才为1 | 位或运算 两个位都为0时,结果才为0 ^ 异或运算 两个位相同为0,相异为1 ~ 取反运算 0变1,1变0 ...

  3. 汇编语言加法和减法详解

    算术运算是汇编语言中一个大得令人惊讶的主题!本节重点在于加法和减法的运算. 先从最简单.最有效的指令开始:INC(增加)和 DEC(减少)指令,即加 1 和减 1.然后是能提供更多操作的 ADD.SU ...

  4. python lambda函数加法_python lambda的使用详解

    1. lambda语法 lambda argument_list: expression lambda是Python预留的关键字,argument_list(参数列表)和expression(关于参数 ...

  5. OpenCV-Python图像融合cv2.addWeighted权重加法函数详解

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 在<OpenCV-Python图像的加法运算cv2.add函数详解> ...

  6. c++十六进制加法_详解C++中十六进制字符串转数字(数值)

    详解C++中十六进制字符串转数字(数值) 主要有两个方法,其实都是对现有函数的使用: 方法1: sscanf() 函数名: sscanf 功  能: 从字符串格式化输入 用  法: int sscan ...

  7. python算法详解 张玲玲_Python算法详解

    目 录 第 1章 算法概述 1 1.1 算法的基础 2 1.1.1 算法的特征 2 1.1.2 何为算法 2 1.2 计算机中的算法 3 1.2.1 认识计算机中的算法 3 1.2.2 为什么说算法是 ...

  8. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h>//01 ...

  9. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

最新文章

  1. 芯片初创公司一亿融资可以烧多久
  2. RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and
  3. 基站定位php,SIM800C支持基站定位功能了。。。
  4. oracle 双引号替换,oracle - Oracle SQL-Loader在值中有效地处理内部双引号 - SO中文参考 - www.soinside.com...
  5. CV2 puttext不能显示中文问题
  6. hcl启动设备失败_英林储罐清洗设备清洗公司2021收费
  7. Bootstrap3 表单
  8. Mac安装protobuf 流程
  9. 转正答辩ppt_如何顺利完成转正答辩?
  10. TreeSet(不可重复,自动排序)实现自定义排序
  11. dbstart $oracle_home,使用dbstart和dbshut命令启动和关闭数据库
  12. acm康复训练记4-world final 2017
  13. Java实现POS打印机无驱打印(转)
  14. 设计篇-网页设计规范
  15. ORACLE读取XML
  16. eval函数python原理_Python 中 eval 函数的神奇用法
  17. trainging contest#1(2011大连现场赛)G BY bly
  18. c语言围棋对弈程序设计,C语言围棋对弈程序设计(59页)-原创力文档
  19. 帝国理工学院计算机科学夲科生数,帝国理工学院计算机科学信息汇总,无背景要求,不需要GRE...
  20. TensorFlow中cnn-cifar10样例代码详解

热门文章

  1. 09 关于 lzf 压缩
  2. 汉语中的词频及笔画数分布规律探析
  3. Mysql修改表中字段名称、字段类型
  4. docker创建容器共享目录
  5. java类和变量的命名规则
  6. 编写程序计算两个矩阵之和。
  7. LaTeX公式-Katex解析
  8. 用PGP实现加密和解密全过程
  9. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...
  10. Client requested master to start replication from impossible position; the last event was read from