c语言——链表——多项式相加

2023-11-09

例题详解:

  1.    一个多项式可以表示为二元组序列{(a1,e1), (a2,e2), … (an,en)}, 其中ai表示第i项的系数(非零值),  ei表示第i项的指数。
  2.    编写函数建立多项式链表实现一个多项式的输入,按指数从高到低有序,返回链表的头指针。

3)      编写函数实现两个多项式相加,返回结果多项式链表的头指针。

4)      编写函数输出一个多项式的二元组序列。

5)      在main函数中分别调用上述函数,实现输入两个多项式,求出它们的和并输出结果。

6)      输入数据分2行,每行分别先给出多项式非零项的个数,再输入每一对非零项系数和指数(假设为绝对值均为不超过10000的整数)。数字间仅以空格分隔。

7)      为简化处理,限定系数与指数都为整数

链表结点数据结构可定义为:


struct PolyNode{
   int a;   //系数
   int e;   //指数
   PolyNode * next; //指向下一个结点
};

输入样例:

4  3 4 -5 2 6 1 -2 0

[注]表示 3x4-5x2+6x-2

3  5 20 -7 4 3 1

[注]表示 5x20-7x4+3x

输出样例:

5 20 -4 4 -5 2 9 1 -2 0

 [注]表示 5x20-4x4-5x2+9x-2

算法概要:

1.建立两条链x,y(尾插法建立)

2.以第一条链x为基准,遍历第二条链比较相加(双指针遍历比较指数,称为双夹法之前文章中有介绍)

3.若找到相加,若找不到加到第一条链之前(头插法摘下单独指数的链节可视为在第二条链中删去,以免下一次遍历重复)

4.最后进行排序(遍历测节点数,以便排序)

代码如下:

#include<stdio.h>
#include<stdlib.h>
struct PolyNode {
	int a;
	int e;
	PolyNode *next;
};
struct PolyNode *input(int n);
struct PolyNode *add(struct PolyNode *head1,struct PolyNode *head2);
struct PolyNode *output(struct PolyNode *head);
int main() {
	int n,m;
	struct PolyNode *x,*y,*z;
	scanf("%d",&n);
	x=input(n);
	scanf("%d",&m);
	y=input(m);
	z=add(x,y);
	output(z);
}
struct PolyNode *input(int s) {
	int i;
	struct PolyNode *head,*p,*q;
	p=(struct PolyNode*)malloc(sizeof (struct PolyNode));
	scanf("%d %d",&p->a,&p->e);
	q=head=p;
	p->next=NULL;
	for(i=1; i<s; i++) {//尾插法
		p=(struct PolyNode*)malloc(sizeof (struct PolyNode));
		scanf("%d %d",&p->a,&p->e);
		q->next=p;
		p->next=NULL;
		q=q->next;
	}
	return (head);
}
struct PolyNode *add(struct PolyNode *head1,struct PolyNode *head2) {
	struct PolyNode *p,*pf,*q,*qf;//双指针记录位置
	q=head1;
	p=head2;//初始化
	while(p!=NULL) {
		while(q!=NULL&&q->e!=p->e) {
			qf=q;
			q=q->next;//遍历第一条链
		}
		if(q==NULL) { //遍历完,未找到 ,加到1链前面
			pf=p;
			p=p->next;//p移到下一个
			pf->next=head1;
			head1=pf;//摘下p,接到1链前面
			q=head1;//q重头开始
		} else {//找到,相加
			q->a+=p->a;
			if(q->a==0) {//判断是否系数为0,为0删去
				q=q->next;
				qf->next=q;//跳过q
			}
			p=p->next;//p移到下一个
			q=head1;//q重头开始
		}
	}
	int atemp,etemp,k,i,j;
	//先测有多少节点
	p=head1;
	while(p!=NULL) {
		k++;
		p=p->next;
	}
	//对新链进行冒泡排序,只交换数据
	for(i=0; i<k-1; i++) {
		p=head1;
		q=head1->next;
		for(j=0; j<k-i-1; j++) {
			if(p->e<q->e) {
				atemp=p->a;p->a=q->a;q->a=atemp;
				etemp=p->e;p->e=q->e;q->e=etemp;
			}
			p=p->next;
			q=q->next;
		}
	}
	return (head1);
}
struct PolyNode *output(struct PolyNode *head) {
	struct PolyNode *z;
	for(z=head; z!=NULL; z=z->next) {
		printf("%d %d   ",z->a,z->e);
	}
}

要点强调:

1.利用双指针记录位置便于插入与删除

2.判断系数相加为零的情况

结果:

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

c语言——链表——多项式相加 的相关文章

  • 华为OD机试 - 太阳能板最大面积(Java)

    题目描述 给航天器一侧加装长方形或正方形的太阳能板 图中的红色斜线区域 需要先安装两个支柱 图中的黑色竖条 再在支柱的中间部分固定太阳能板 但航天器不同位置的支柱长度不同 太阳能板的安装面积受限于最短一侧的那根支柱长度 如图 现提供一组整形

随机推荐

  • 计算机中的打印机,如何添加打印机,教您电脑如何添加打印机

    打印机是我们工作中不可缺少的办公设备 那如果电脑上没安装打印机 可以进行打印吗 我们可以通过连接到同一网络上的打印机进行打印作业 那电脑怎样进行添加打印机呢 下面 小编给大家带来了电脑添加打印机的图文 打印机是现在我们办公设备的必要用品之一
  • 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1 案例描述 作为Windows程序员 平时最担心见到的事情可能就是程序发生了崩溃 异常 这时Windows会提示该程序执行了非法操作 即将关闭 请与您的供应商联系 呵呵 这句微软的 名言 恐怕是程序员最怕见也最常见的东西了 在一个大型软件
  • spring boot集成mybatis无法扫描mapper文件(坑)

    大半天耗在这上面 真的无语了 现象解决了 原因待查找 首先 如果你的spring boot集成mybatis项目报这个错 同时你使用的是YML的配置方式 再同时你用的是Intellij 那么就往下看吧 解决方法就是 使用这种配置方式 命名为
  • 马虎的算式

    标题 马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类
  • 刷题之反转字符串

    编写一个函数 其作用是将输入的字符串反转过来 输入字符串以字符数组 s 的形式给出 不要给另外的数组分配额外的空间 你必须原地修改输入数组 使用 O 1 的额外空间解决这一问题 示例 1 输入 s h e l l o 输出 o l l e
  • LAST_INSERT_ID使用造成订单串单问题

    订单串单问题 代码 String sql insert into this update sql List
  • 用动态数组实现了顺序表

    用动态数组实现了顺序表 作者 吕翔宇 e mail 630056108 qq com ALL RIGHTS RESERVED 版权所有 include
  • Spring Boot定时任务在分布式环境下的轻量级解决方案

    文章非原创 转载简书 原作者 foundwei 转载链接 https www jianshu com p 41970ba48453 Spring Boot提供了一个叫做Spring Task的任务调度工具 支持注解和配置文件形式 支持Cro
  • CGAL计算几何算法库安装和使用(一)

    CGAL是使用C 开发的计算几何算法库 提供Delaunay三角网 网格生成 多边形 以及各种几何处理算法 应用领域 计算机图形学 科学可视化 计算机辅助设计与建模 地理信息系统 分子生物学 医学影像学 机器人学和运动规划 和数值方法 1
  • KVM同步脏页原理

    文章目录 硬件基础 SPTE 硬件要素 工作流程 PML 硬件要素 工作流程 数据结构 用户态 内核态 API 脏页开启 脏页获取 流程 使能记录 记录脏页 流程图 具体过程 获取脏页 流程图 具体过程 实验 QEMU在内存迁移阶段首先会标
  • Struts2框架验证

    struts2有框架验证 我这边主要说的是XML配置的struts2的框架验证 继承validate方法的验证还是比较容易的 至于有人用注解来验证不怎么常见我也不讲了 感觉好多东西总结的都会有注解来掺和一脚 比如spring注入方式 最常见
  • Python全系列教程:超详细1小时学会Python,太简单了

    1 Hello world 安装完Python之后 打开IDLE Python GUI 该程序是Python语言解释器 你写的语句能够立即运行 我们写下一句著名的程序语句 并按回车 你就能看到这句被K R引入到程序世界的名言 在解释器中选择
  • UFT 自带两个经典sample航空订票应用程序

    大家知道UFT是QTP的升级换代产品 一定保留上一版系统原有的一些的痕迹 比如经典的Flights应用 安装路径 D Program Files x86 Micro Focus Unified Functional Testing samp
  • 单片机定时器/计数器、中断和串口控制位

    一 定时器 计数器 1 定时器控制寄存器 TCON TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF1 TF0 定时器 计数器中断请求标志位当定时器计数满溢出回零时 有硬件置位 并可申请中断 当CPU响应中断并
  • C语言:(含大量图解)你真的了解结构体吗?

    文章目录 结构体 结构体的定义 结构体大小计算 结构体的对齐规则 关于对齐规则的解释 为什么C语言要这样进行大小设定 平台移植原因 追求高性能 修改默认对齐数 结构体传参问题 结构体 结构体的定义 结构体是一些值的集合 这些值被称为成员变量
  • 【RPC】RPC的序列化方式

    序列化 网络传输的数据必须是二进制数据 但调用方请求的出入参数都是对象 对象是不能直接在网络中传输的 所以我们需要提前把它转成可传输的二进制 并且要求转换算法是可逆的 这个过程我们一般叫做 序列化 这时 服务提供方就可以正确地从二进制数据中
  • 小程序——wxml组件和wxss适配

    一 和以往代码区别 wxml html zhuiy css view div text文字 加入这个可以长按选中 否则不能复制 image img button button form form input input label labe
  • Leetcode1333.餐厅过滤器——使用stream流

    文章目录 引入 本题题解 后记 int Integer List的互相转化 引入 在上周周赛中 有这么一道题 1333 餐厅过滤器 给你一个餐馆信息数组 restaurants 其中 restaurants i idi ratingi ve
  • Java远程调试原理与运用

    Java远程调试的原理是两个VM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 首先被debug程序的虚拟机在启动时要开启debug模式 启动debug监听程序 jdwp是Java Debug
  • c语言——链表——多项式相加

    例题详解 一个多项式可以表示为二元组序列 a1 e1 a2 e2 an en 其中ai表示第i项的系数 非零值 ei表示第i项的指数 编写函数建立多项式链表实现一个多项式的输入 按指数从高到低有序 返回链表的头指针 3 编写函数实现两个多项