基于单链表实现一元n次多项式的创建、输出和求和操作

2023-11-11

在主函数中调用函数CreatePolyn ()函数创建两个多项式:

2 + 3X + 5X3 + 2X4

3 + 2X + 4X2

然后调用函数AddPolyn求它们的和,最后打印出求和后的结果。

提示:

/*①多项式数据结构定义*/

typedef  struct pnode{

      float coef;                 //系数

      int expn;                  //指数

} ElemType;

typedef  LinkList  Polynomial;    //一元n次多项式类型定义

 

/*②多项式操作接口定义*/

// 创建一个一元多项式 

Status CreatePolyn(Polynomial &P);

 

// 打印该链表的结果 

void PrintPolyn(Polynomial pList);

 

// 比较两个结点的指数的大小

int cmp(ElemType a, ElemType b);

 

// 把两个一元多项式相加 

Polynomial AddPolyn(Polynomial pa, Polynomial pb);

 

/*③部分操作的实现函数*/

// 创建一个一元多项式 

Status CreatePolyn(Polynomial &P)

{

InitList_L(P); //初始化链表

printf("请输入多项式项数m:\n");

scanf("%d",&m);

printf("请输入多项式每项的系数和指数,格式如(3.0, 2):\n");

for(i=1;i<=m;i++)

{

输入一个结点,将其根据指数从小到大的排列顺序插入链表

}



#include<stdio.h>
#include<stdlib.h>
#define OK     1
#define ERROR  0
typedef int Status ;
typedef int ElemType ;

typedef  struct pnode
{
      float coef;                 //系数 
      int expn;                  //指数 
	  struct pnode *next;
}pnode,*Polynomial; 

//初始化
Status  InitList_L(Polynomial &P);

// 创建一个一元多项式 
Status CreatePolyn(Polynomial & P);

// 打印该链表的结果 
Status PrintPolyn(Polynomial pList);

// 比较两个结点的指数的大小 
int cmp(ElemType a, ElemType b);

// 把两个一元多项式相加 
Polynomial AddPolyn(Polynomial pa, Polynomial pb);
//单链表的初始化
Status  InitList_L(Polynomial &P)
{
       P=new pnode;
       P->next=NULL;
	   return OK;
}

// 创建一个一元多项式 
Status CreatePolyn(Polynomial &P)
{
	InitList_L(P); //初始化链表
	Polynomial q;
	int i,m;
	P=(pnode*)malloc(sizeof(pnode));//生成结点
	P->next=NULL;
	q=P;
	printf("请输入多项式项数m:\n");
	scanf("%d",&m);
	printf("请输入多项式每项的系数和指数,格式如(3.0, 2):\n");
	for(i=1;i<=m;i++)
	{ // 依次输入m个非零项(可按任意顺序) 
		q=(pnode*)malloc(sizeof(pnode));
		scanf("%f,%d",&q->coef,&q->expn);
		q->next =P->next ;
		P->next =q;
	}
	return OK;
}//CreatPolyn

// 打印该链表的结果 
Status PrintPolyn(Polynomial P)
{
    while(P->next !=NULL)
	{ 
       P=P->next;
       printf("(%5.2f)x^%d+",P->coef,P->expn); 
	}
	printf("0");
	printf("\n");
	return OK;
}

// 比较两个结点的指数的大小 
int cmp(int a,int b) 
{
	if(a>b) return 1;
	else if(a<b) return -1;
	else return 0;
}

// 把两个一元多项式相加 
Polynomial AddPolyn(Polynomial pa, Polynomial pb)
{ 
	 Polynomial 	qc;	/* 用来指向新链表的尾结点的 */
	 Polynomial 	qa;	/* 指向第一个链表的当前结点 */
	 Polynomial 	qb;	/* 指向第二个链表的当前结点*/
	 Polynomial 	temp;	/* 删除结点时做临时变量用 */
	 ElemType   a,b;             /* 分别存放两个链表当前结点的数据 */
	 float	sum;	               /* 存放两个链表中当前结点的系数和 */

	 qc = pa;
	 qa = pa->next;
	 qb = pb->next;

	while( qa && qb )
	{
		a = qa->expn ; 
		b = qb->expn ;
		switch( cmp(a,b) )
		{
    	case -1:	  /* 第一个链表中当前结点的指数值小 */
			qc->next=qa;	/* Link the node to the end of qc */
			qc=qa;			/* move the tail pointer to qa */
			qa=qa->next;	/* move to the next node of qa */
			break;
		case 0:		/* 指数值相等 */
			sum = qa->coef + qb->coef;
			if( sum != 0.0)
			{
				qa->coef=sum;
				qc->next=qa;	  /* Link qa to the result polyn */
				qc=qa;		    /* Let qc still point to the tail */
				qa=qa->next;
			}
			else
			{	/* 释放qa所指向的结点的空间 */
				temp=qa ; /* qa is to be deleted, let temp point to it */
				qa=qa->next;	/* Let qa point to the next node */
				free(temp);		/* Free the space */
			}
				/* 释放qb所指向的结点的空间 */
			temp = qb;
			qb = qb->next;		/* let qb point to the next node */
			free(temp);
			break;
		case 1:		/* 第一个链表中当前结点的指数值大 */
			qc->next = qb;
			qc = qb;
			qb = qb->next;
			break;
		}	/* End of Switch */
	}	/* End of while(!qa && !qb) */

	qc->next = qa?qa:qb;	/* Link the rest nodes of polynomial 1 or 2 */

	free(pb);    /* Free the head node of the 2nd polynomial  */
	return (pa);
}
 
void main()
{
	Polynomial Pa,Pb;
	printf("***************一元多项式加法运算*********************\n");
	printf("\n______________第一个多项式______________\n");
	CreatePolyn(Pa);
    printf("第一个多项式为:");
	PrintPolyn(Pa);
	printf("\n\n______________第一个多项式______________\n");
	CreatePolyn(Pb);
	printf("第二个多项式为:");
	PrintPolyn(Pb);
    AddPolyn(Pa,Pb);
	printf("\n\n两个多项式的和为:");
	PrintPolyn(Pa);
	system("pause");
}


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

基于单链表实现一元n次多项式的创建、输出和求和操作 的相关文章

  • 无线渗透测试&基础命令操作

    文章目录 无线网络参数 基础命令 iwconfig route route相关文件 arp arp相关文件 常用命令 aireplay ng airodump ng 无线网络参数 Cell 01 Address 78 EB 14 B9 96

随机推荐

  • Unity Timeline的使用

    创建TimeLine 第一种方法 在Assets目录下 右键Create gt TimeLine 双击创建的TimeLine文件 就可以打开TimeLine窗口 第二种方法 找到右上角的菜单Window 找到Sequencing gt Ti
  • uniapp 微信小程序 web-view如何查看console.log和调试H5页面

    问题场景 在微信小程序的页面中 web view内嵌了另一个页面url 从小程序跳转到该H5页面的时候 看不到该H5页面的控制台调试信息console log值 解决方案 当从小程序跳转到H5页面的时候 在微信开发者工具模拟器页面的底栏 会
  • 基于stata的medsens包进行中介效应分析

    中介变量 mediator 是一个重要的统计概念 如果自变量 X 通过某一变量 M 对因变量 Y 产生一定影响 则称 M 为 X 和 Y 的中介变量 我们既往已经介绍了SPSS和R语言行中介效应分析 今天继续介绍stata中介效应分析 大家
  • 使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)

    使用Swin Transformer Semantic Segmentation训练自己的数据 系统配置 代码链接 针对MMCV 选择系统 Windows环境要求 ubuntu 18 04 安装swin segmentation 制作VOC
  • [IC卡类型]带你认识 M1、UID、CUID、FUID、UFUID

    普通IC卡 0扇区不可以修改 其他扇区可反复擦写 我们使用的电梯卡 门禁卡等智能卡发卡商所使用的都是 M1 卡 可以理解为物业发的原卡 UID 卡 普通复制卡 可以重复擦写所有扇区 主要应用在IC卡复制上 遇到带有防火墙的读卡器就会失效 C
  • 运算符重载(实现日期类)

    对基本的数据类型 都支持 等操作 对于自定义类型 要实现这些操作就要自己编写函数 这时候 C 提供了运算符重载的语法 及简化了调用的代码 又增加了可读性 运算符重载的特征 operator 合法的运算符 构成函数名 eg operator
  • 安上这几个插件,使用JetBrains 家族软件效率翻个倍儿

    文章目录 前言 安装插件 方式一 编辑器内直接安装 方式二 插件主页安装 Background Image From Bing Chinese Simplified Language Pack 中文语言包 Gitee Indent Rain
  • 攻防世界web新手之disabled_button

    攻防世界web新手之disabled button 打开题目链接 发现有一按钮 但是无法按下 查看源码发现 是这个 disabled 在捣鬼 我们不能通过点击按钮提交表单 那大不了就手动提交嘛 使用Firefox的hackbar插件就很容易
  • 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl

    解决 Dmaven multiModuleProjectDirectory system property is not set Check M2 HOME environment variable and mvn script match
  • 关于数码管

    数码管显示 数码管 数码管根据内部连接的不同分为共阴极和共阳极 八段数码管内部有8颗LED组成 如果想要显示特定字形 只需控制相应的LED亮起 其它LED熄灭即可 判断数码管是共阴极还是共阳极 如果是共阴极 中间公共脚为GND 如果是共阳极
  • 基于STM32的智能温室大棚

    本文将具体说明植物试验基地温室大棚监控系统设计开发详情和流程 该系统可实现以下这些功能 本系统设计主要有两大方向 一为自动操控界面 系统自动监测环境并根据监测到的参数执行相应的操作 二为人为手动控制 人为的监测环境并操控功能的打开 本系统设
  • centos7系统基础环境优化

    关闭selinux sed i s SELINUX enforcing SELINUX disabled g etc selinux config 关闭防火墙 systemctl disable firewalld systemctl st
  • 【dc-dc】降压恒压电源管理IC 平衡车控制器 电动车控制器 以太网交换机驱动芯片

    产品 AP8851 一款宽电压范围降压型DC DC 电源管理芯片 内部集成使能开关控制 基准电源 误差放大器 过热保护 限流保护 短路保护等功能 非常适合在宽输入电压范围具有优良的负载和线性调整度 AP8851 芯片包含每周期的峰值限流 软
  • Java项目:springboot+vue的简历信息网站—计算机毕业设计

    运行环境 开发工具 IDEA Eclipse 数据库 MYSQL5 7 应用服务 Tomcat7 Tomcat8 使用框架springboot vue 项目介绍 本选题则旨在通过标签分类管理等方式 实现管理员 首页 个人中心 用户管理 简历
  • 攻防世界 shrine 解题思路

    进入题目 发现一串源代码 但是不规则 所以我们ctrl u查看源代码 这样就整理好了代码 接下来就是审计代码了 我们来看看这个代码都写了啥 首先导入了两个模块 一个flask 一个os 然后用app route装饰器传了两个路径 那我们访问
  • 文件系统FastDFS和阿里云OSS

    文章目录 1 分布式文件存储 FastDFS 1 1 FastDFS简介 1 1 1 FastDFS体系结构 1 1 2 上传流程 1 2 FastDFS搭建 容器化部署 1 2 0 Vmware虚拟机配置 1 2 1 拉取镜像 1 2 2
  • helm和chart

    Helm helm是Kubernetes 应用的包管理工具 主要用来管理 Charts 类似Linux系统的yum Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件 可以在你部署应用的时候自定义应
  • Elasticsearch7.1中文文档-第四章-API约定

    Elasticsearch REST APIs是用HTTP暴露的 并且是基于JSON的 除非另有说明 否则本章中的约定都可以使用REST API来使用 多索引 索引名称中支持日期数学 公用选项 基于URL的访问控制 多索引 大多数引用ind
  • 清除浮动的4种方式

    为什么要清除浮动 清除浮动主要是为了解决 父元素因为子级元素浮动引起的内部高度为0的问题 如下 给父盒子设置一个boder 内部放两个盒子一个big 一个small 未给big和small设置浮动 则他们会默认撑开父盒子 当我给内部两个盒子
  • 基于单链表实现一元n次多项式的创建、输出和求和操作

    在主函数中调用函数CreatePolyn 函数创建两个多项式 2 3X 5X3 2X4 3 2X 4X2 然后调用函数AddPolyn求它们的和 最后打印出求和后的结果 提示 多项式数据结构定义 typedef struct pnode f