两个多项式的相加操作 C语言(链式存储结构)

2023-10-29

内容:

       完成两个多项式的相加操作:已知有两个多项式P(x),Q(x),设计算法实现P(x)+Q(x)运算。而且对加法运算不重新开辟存储空间。要求用链式存储结构。

       例如:P(x)=5x^3+2x+1,Q(x)=3x^3+x^2-2x-3,其计算输出结果为:8x^3+1x^2-2.

相减操作,以上述为例,则其输出结果为:2x^3-x^2-4x-2

步骤:

1.问题分析和算法设计:

      多项式加法:本题的需要求出两个多项式的和,因此需要先使用Init()来初始化一个空链表,再使用CreateFromTail()用来创建一个链表,在此程序中使用尾插法来创建链表。对于两个多项式的加法,使用Polyadd()用来实现两个多项式的相加算法;用Print()输出多项式。

       两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针LA1和LB1分别从多项式P(x)和Q(x)的首结点移动,比较LA1和LB1所指结点的指数项,分下面三种情况进行处理:

(1)若LA1->exp<LB1->exp,则LA1所指结点为多项式中的一项,LA1指针在原来的基础上向后移动一个位置。

(2)若LA1->exp=LB1->exp,将对应项的系数相加,然后分两种情况处理:如果系数的和为0,则释放LA1和LB1所指向的结点:如果系数项的和不为0,则修改LA1所指向结点的系数域,释放LB1结点。

(3)若LA1->exp>LB1->exp,则LB1所指结点为多项式中的一项,LB1指针在原来的基础上向后移动一个位置。

2.概要设计:

                        函数                          作用
                        Init() 初始化链表
                 CreateFromTail()                       创建链表
                   Ployadd()                 实现多项式加法
                       Print()                   输出多项式

3.程序运行流程图:

 

                                                                                       图1  程序流程图

4.源代码(vc++6.0调试通过)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct poly
{
	int exp;           /*指数幂*/
	int coef;          /*系数*/
	struct poly *next;  /*指针域*/
 }PNode,*PLinklist;
 int Init(PLinklist *head)   /*链表初始化*/
 {
 	*head=(PLinklist)malloc(sizeof(PNode));
 	if(*head)
 	{
 		(*head)->next=NULL;
 		return 1;
	 }
	 else
	 	return 0;
 }
int CreateFromTail(PLinklist *head)  /*尾插法创建链表*/
{
 	PNode *pTemp,*pHead;
 	int c;               /*存放系数*/
 	int exp;             /*存放指针*/
	int i=1;             /*计数器提示用户输入第几项*/ 
	pHead=*head;
	scanf("%d,%d",&c,&exp);
	while(c!=0)          /*系数为0表示结束输入*/
	{
		pTemp=(PLinklist)malloc(sizeof(PNode));
		if(pTemp)
		{
			pTemp->exp=exp;  /*接收指数*/
			pTemp->coef=c;    /*接收系数*/
			pTemp->next=NULL;
			pHead->next=pTemp;
			pHead=pTemp;
			scanf("%d,%d",&c,&exp);
		}
		else
			return 0;
	 } 
	 return 1;
  } 
  void Polyadd(PLinklist LA,PLinklist LB)/*两个多项式相加,该方法两个表都是按指数顺序增长*/
  {   /*对指数进行对比分三类情况;A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中*/
  		PNode *LA1=LA->next;    /*用于在LA中移动*/
  		PNode *LB1=LB->next;     /*用于在LB中移动*/
  		/*LA与1B在充当LA1和LB1的前驱*/
  		PNode *temp;          /*保存要删除的结点*/
		  int sum=0;      /*存放系数的和*/
		  while(LA1&&LB1)
		  {
		  	if(LA1->exp<LB1->exp)
		  	{
		  		LA->next=LA1;     /*LA的当前结点可能时LB1或LA1*/
		  		LA=LA->next;
		  		LA1=LA1->next;
			  }
			  else if(LA1->exp==LB1->exp)  /*指数相等系数相加*/ 
			  {
			  	sum=LA1->coef+LB1->coef;
				  if(sum)   /*系数不为0,结果存入LA1中,同时删除结点LB1*/
				  {
				  	LA1->coef=sum;
					LA->next=LA1;
		            LA=LA->next;
		            LA1=LA1=LA1->next;
		            temp=LB1;
		            LB1=LB1->next;
		            free(temp);
				   } 
				   else     /*系数为0时的情况下删除两个结点*/
				   {
				   	temp=LA1;
					LA1=LA1->next;
					free(temp);
					temp=LB1;
					LB1=LB1->next;
					free(temp); 
			  }
		   } 
		   else
		   {
		   	LA->next=LB1;
			LA=LA->next;
			LB1=LB1->next; 
		   }
		   
  }
  if(LA1)  /*将剩余结点链入链表*/
  		LA->next=LA1;
	else
		LA->next=LB1;
}
  void Print(PLinklist head) /*输出多项式*/
{
	head=head->next;
	while(head)
	{
		if(head->exp)
				printf("%dx^%d",head->coef,head->exp);
			else
				printf("%d",head->coef);
			if(head->next)
				printf("+");
			else
				break;
			head=head->next;
	}
}
void main()
{
	PLinklist LA;  /*多项式列表LA*/
	PLinklist LB;  /*多项式列表LB*/
	Init(&LA);
	Init(&LB);
	printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LA);
	printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LB);
	Print(LA);
	printf("\n");
	Print(LB);
	printf("\n");
	Polyadd(LA,LB);
	printf("两个多项式相加的结果:\n");
	Print(LA);    /*相加的结果保存在LA中,打印LA*/
	printf("\n"); 
}

 5.测试结果:

 

                                                                              图2  测试结果图

 以上为使用链式存储进行多项式加法的全部分析过程和操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个多项式的相加操作 C语言(链式存储结构) 的相关文章

随机推荐

  • 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR。出现 OLE DB 错误。

    原来是一个varchar字段出出现了 和 等特殊字符 这个在insert语句中没有问题 但是使用导入导出会报错 最后要注意的是 导入导出使用的是BulkInsert 方式 每次可能读取一大段 多行记录一起处理 如果这批数据中有错 那么 程序
  • html5注册阿里巴巴作业,面试分享:2018阿里巴巴前端面试总结(题目+答案)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 使用js实现一个持续的动画效果 最开始的思路是用定时器实现 最后没有想的太完整 面试官给出的答案是用 requestAnimationFrame var e document getElemen
  • Java基础(四)——多态、抽象类、接口、内部类

    一 多态 1 多态性是指同一操作作用于某一类对象 可以有不同的解释 产生不同的执行效果 同一事件发生在不同的对象身上 有不同的效果 2 多态存在的三个必要条件 a 需要存在继承和实现关系 b 同样的方法调用而执行不同操作 运行不同代码 重写
  • JS 中把对象按属性名字母顺序进行排序和倒序

    本文同步发布在 JS 中把对象按属性名字母顺序进行排序和倒序 我们在进行前端开发的时候 有时需要对参数进行签名 签名很多第一步是把对象按属性名字母顺序进行排序 那么在 JS 中如何实现呢 实现方式很多 这边介绍一种通过 ES6 的方式来实现
  • Andy‘s First Dictionary C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 原文 Andy 8 has a dream he wants to produce his very own dictionary This is not an easy task for him
  • vue实现动态锚点

    div class dialog header item item div 需要点击的目标增加click事件 并且把索引传下去 没有索引也没有关系 想传什么传什么 锚点 getActiveClass index let jump docum
  • 「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

    本文主要介绍如何从最开始的草图 通过确定基本结构 修改元素布局 美化外观来实现一个网站导航栏 从而熟悉网页开发的基本流程 同时 我们会把性能 规范性 可维护性方面的代码优化也考虑其中 文章目录 本系列前文传送门 一 场景说明 设计目标 二
  • 几种常用激活函数的简介

    1 sigmod函数 函数公式和图表如下图 在sigmod函数中我们可以看到 其输出是在 0 1 这个开区间内 这点很有意思 可以联想到概率 但是严格意义上讲 不要当成概率 sigmod函数曾经是比较流行的 它可以想象成一个神经元的放电率
  • Python正则表达式学习(3)——re.compile()

    re compile pattern flags 0 将正则表达式 pattern 编译为正则表达式对象 可用于使用其 match 和search 方法进行匹配 顺序 prog re compile pattern result prog
  • Pinctrl子系统之一了解基础概念

    1 Linux Pinctrl子系统简介 在许多soc内部都包含有pin控制器 通过pin控制器的寄存器 我们可以配置一个或者一组引脚的功能和特性 在软件方面 Linux内核提供了pinctrl子系统 目的是为了统一各soc厂商的pin脚管
  • TreeView —WPF—MVVM—HierarchicalDataTemplate

    摘要 采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树 支持勾选 勾选父节点 子节点回全部自动勾选 子节点部分勾选时 父节点半勾选 子节点全部勾选时 父节点勾选 反之亦然 Hier
  • 吴恩达9.3 反向传播的直观理解

    为了更好地理解反向传播算法 我们再来仔细研究一下前向传播的原理 前向传播算法 反向传播算法做的是
  • Qt基础——UI文件.h文件说明

    首先 需要使用Qt Designer设计你的UI界面 Qt号称是跨平台应用程序和UI开发框架 所以其自带的UI设计器 即Qt Designer 功能也非常强大 除了通常用的如Button List等组件外面 使用Qt Designer做UI
  • mac出现wifi没有ip地址无法接入互联网

    问题 情况 wifi已经输入密码正确 但是中间出现灰色的wifi图标 还有一个叹号 说是没有IP地址 解决方法 1 试过重启 2 试过删掉该网络再重新输入密码 3 试过删掉WiFi一栏 来自百度 最佳答案 1 首先打开偏好设置 点击网络选项
  • 用Python赚钱的方法有哪些?

    很多人想知道用Python赚钱的方法有哪些 Python很容易使用 应用性较强 可以通过使用Python开发小程序 抓取数据 游戏开发 兼职编程老师 发展副业的方式来赚钱 文末有福利 用Python赚钱的方法 1 某宝搜python程序 可
  • java多线程设计模式

    1 I O处理比较花费时间 故把执行I O处理和非IO处理的线程分开 CPU执行速度很快 而内存的写入 读取很慢 所以有关CPU和内存交互会降低指令的速度 2 start方法运行有2个步骤 启动新的线程 运行new对象的run方法 3 所有
  • AD19 PCB设计导入元件库、导出pdf、定义板子形状、生成元件库、铺铜基本操作总结

    导入元件库 1 点击右侧components 2 右键 然后选择 Add or Remove Libraries 3 点击从文件安装 4 选择库文件 导出PDF 导出原理图或者pcb等信息pdf操作 文件 gt 智能pdf 定义板子形状 使
  • 慕课第四周第7题 出租车计价

    出租车计价 4分 题目内容 已知某城市普通出租车收费标准为 起步里程为3公里 起步费为8元 10公里以内超过起步里程的部分 每公里加收2元 超过10公里以上的部分加收50 的回空补贴费 即每公里3元 出租车营运过程中 因堵车和乘客要求临时停
  • eigen 教程和指南

    转自 http eigen tuxfamily org dox 2 0 TutorialCore html https blog csdn net xuezhisdc article details 54619853 固定大小的矩阵和向量
  • 两个多项式的相加操作 C语言(链式存储结构)

    内容 完成两个多项式的相加操作 已知有两个多项式P x Q x 设计算法实现P x Q x 运算 而且对加法运算不重新开辟存储空间 要求用链式存储结构 例如 P x 5x 3 2x 1 Q x 3x 3 x 2 2x 3 其计算输出结果为