一元多项式相加问题(两种方法)

这篇具有很好参考价值的文章主要介绍了一元多项式相加问题(两种方法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一元多项式的相加问题,主要运用了线性结构的合并,在合并线性结构的基础上,增加判断,所以我们可以将这个问题理解为一个复杂的线性表合并问题 

目录

问题描述

一、顺序表法

1.1 初始化并创建顺序表

1.2 一元多项式相加算法

1.3 完整代码

二、单链表法

1.1 初始化并创建链表

1.2 一元多项式相加算法

1.3 完整代码

三、运行结果

附:系列文章


问题描述

【问题描述】

用线性表存放一元多项式,实现两个一元多项式相加,输出结果多项式。
【输入形式】

分两行依次输入两个一元多项式,按指数由低到高依次输入表达式各项的系数和指数,输入字符结束,如果输入的某项系数为0,则不建立该项。

【输出形式】

按指数由低到高依次输出结果表达式各项的系数和指数,如果结果表达式为空则不输出。

【样例输入1】

7 0 3 1 9 8 5 17  10 21 a

8 1 22 2 -9 8 a

【样例输出1】
7.000000 0  11.000000 1 22.000000 2 5.000000  17 10.000000 21

【样例输入2】

22.2 1 a

-22.2 1 b

【样例输出2】

一、顺序表法

利用顺序表实现一元多项式的相加时,我们需要一个存放系数项的数组和一个存放指数项的数组,在执行合并的过程中对指数项进行判断,最后将系数等于零的项删除即可

1.1 初始化并创建顺序表

初始化和创建过程可以参考顺序表的创建,唯一不同的是这里是两个数组而已

typedef struct List{
	double *base1;   //系数,double型变量   (理解为数组)
	int *base2;      //指数,int型变量      (数组)
	int len;
	int size;
}List,*PList;
int Init_List(PList L){
	L->base1=(double*)malloc(sizeof(double)*SIZE);  //初始化
	L->base2=(int*)malloc(sizeof(int)*SIZE);
	L->len=0;
	L->size=SIZE;
	return 1;
}
int Creat_List(PList L){   //创建的时候注意要给系数指数都赋值,其他就是创建顺序表的方法
	double a;
	int b;
	int i=0;
	while(scanf("%lf %d",&a,&b)==2){ 
        if(a==0) continue;         //系数为零时不建立这个项,直接下一次循环 
		if(L->len>=L->size){
			L->base1=(double*)realloc(L->base1,sizeof(double)*(L->size+INCREAM));
			L->base2=(int*)realloc(L->base2,sizeof(int)*(L->size+INCREAM));
			L->size+=INCREAM;
		}
		L->base1[i]=a;
		L->base2[i++]=b;
		L->len++;
	}
	return 1;
}

1.2 一元多项式相加算法

这个算法中一定要注意,当把所有元素都判断完并放入L3中后,一定要小心L3的长度不能忘

int Connect_List(PList L1,PList L2,PList L3){
	int i=0,j=0,k=0;    //分别为L1,L2,L3的下标(L1,L2,L3是数组)
	if(L1->len+L2->len>L3->len){    //判断L3空间是否足够,不够时要重新开辟空间
		L3->base1=(double *)realloc(L3->base1,(L3->size+INCREAM)*sizeof(double));
		L3->base2=(int *)realloc(L3->base2,(L3->size+INCREAM)*sizeof(int));
		L3->size+=INCREAM;
	}
	while(i<L1->len&&j<L2->len){  //循环执行判断,直到一方元素循环完退出循环
		if(L1->base2[i]==L2->base2[j]){ //当L1,L2的指数项相等时,L3的系数项等于两者系数相加
            L3->base1[k]=L1->base1[i]+L2->base1[j++]; 
            L3->base2[k++]=L1->base2[i++];
		}else if(L1->base2[i]<L2->base2[j]){  //当L1指数项较小时,L3的系数就是L1
			L3->base1[k]=L1->base1[i];
			L3->base2[k++]=L1->base2[i++];
		}else{                                //当L2指数项较小时,L3的系数就是L2
			L3->base1[k]=L2->base1[j];
			L3->base2[k++]=L2->base2[j++];
		}
	}
	while(i<L1->len){           //另一个循序表里剩余的元素都放入L3
		L3->base1[k]=L1->base1[i];
		L3->base2[k++]=L1->base2[i++];
	}
	while(j<L2->len){          
		L3->base1[k]=L2->base1[j];
		L3->base2[k++]=L2->base2[j++];
	}
	L3->len=k;                //千万不能忘掉L3的长度!!
	for(i=0;i<L3->len;i++){    //最后将L3中系数等于0的项删除
		if(L3->base1[i]==0){
			for(j=i;j<L3->len-1;j++){
				L3->base1[j]=L3->base1[j+1];
				L3->base2[j]=L3->base2[j+1];
			}
			L3->len--;
		}
	}
	return 1;
}

1.3 完整代码

#include<stdio.h>
#include<malloc.h>
#define SIZE 10
#define INCREAM 10
typedef struct List{
	double *base1;
	int *base2;
	int len;
	int size;
}List,*PList;
int Init_List(PList L){
	L->base1=(double*)malloc(sizeof(double)*SIZE);
	L->base2=(int*)malloc(sizeof(int)*SIZE);
	L->len=0;
	L->size=SIZE;
	return 1;
}
int Creat_List(PList L){
	double a;
	int b;
	int i=0;
	while(scanf("%lf %d",&a,&b)==2){
        if(a==0) continue;
		if(L->len>=L->size){
			L->base1=(double*)realloc(L->base1,sizeof(double)*(L->size+INCREAM));
			L->base2=(int*)realloc(L->base2,sizeof(int)*(L->size+INCREAM));
			L->size+=INCREAM;
		}
		L->base1[i]=a;
		L->base2[i++]=b;
		L->len++;
	}
	return 1;
}
int Print_List(PList L){
	int i;
	for(i=0;i<L->len;i++){
		printf("%lf %d ",L->base1[i],L->base2[i]);
	}
	printf("\n");
	return 1;
}
int Connect_List(PList L1,PList L2,PList L3){
	int i=0,j=0,k=0;
	if(L1->len+L2->len>L3->len){
		L3->base1=(double *)realloc(L3->base1,(L3->size+INCREAM)*sizeof(double));
		L3->base2=(int *)realloc(L3->base2,(L3->size+INCREAM)*sizeof(int));
		L3->size+=INCREAM;
	}
	while(i<L1->len&&j<L2->len){
		if(L1->base2[i]==L2->base2[j]){
            L3->base1[k]=L1->base1[i]+L2->base1[j++];
            L3->base2[k++]=L1->base2[i++];
		}else if(L1->base2[i]<L2->base2[j]){
			L3->base1[k]=L1->base1[i];
			L3->base2[k++]=L1->base2[i++];
		}else{
			L3->base1[k]=L2->base1[j];
			L3->base2[k++]=L2->base2[j++];
		}
	}
	while(i<L1->len){
		L3->base1[k]=L1->base1[i];
		L3->base2[k++]=L1->base2[i++];
	}
	while(j<L2->len){
		L3->base1[k]=L2->base1[j];
		L3->base2[k++]=L2->base2[j++];
	}
	L3->len=k;
	for(i=0;i<L3->len;i++){
		if(L3->base1[i]==0){
			for(j=i;j<L3->len-1;j++){
				L3->base1[j]=L3->base1[j+1];
				L3->base2[j]=L3->base2[j+1];
			}
			L3->len--;
		}
	}
	return 1;
}
int main(){
	List L1,L2,L3;
	Init_List(&L1);
	Init_List(&L2);
	Init_List(&L3);
	Creat_List(&L1);
	getchar();
	Creat_List(&L2);
	Connect_List(&L1,&L2,&L3);
	Print_List(&L3);
	return 0;
}

二、单链表法

运用单链表实现一元多项式相加的过程和顺序表类似,核心算法思想就是循环判断,将指数较小的项放入第三个表,当指数项相等时系数相加放入第三个表

1.1 初始化并创建链表

初始化和创建过程就是创建单链表的过程,唯一不同的也是我们有两个数据域

typedef struct Node{
	double data1;    //系数
	int data2;           //指数
	struct Node * next;
}Node,*PNode;
PNode Init_Node(){           //初始化和创建发放就是链表的创建方法
	PNode head=(PNode)malloc(sizeof(Node));
	head->next=NULL;
	return head;
}
int Creat_Node(PNode head){
	double a;
	int b;
    PNode p=head;
	while(scanf("%lf %d",&a,&b)==2){
        if(a==0) continue;        //系数为0,不建立该项
		PNode q=(PNode)malloc(sizeof(Node));
		q->data1=a;
		q->data2=b;
		p->next=q;
		p=q;
	}
	p->next=NULL;
	return 1;
}

1.2 一元多项式相加算法

算法思想与顺序表相同,循环判断,但是在单链表中,当我们遇到系数相加为零时可以直接释放,不连接到第三个单链表的后面,这正是单链表实现这个问题的一大亮点

PNode Connect_Node(PNode head1,PNode head2,PNode head3){
	PNode p,q,r;
	r=head3;     //第三个单恋表
	p=head1->next;
	q=head2->next;
	while(p&&q){
		if(p->data2<q->data2){    //判断将指数较小的项连接到r后面
			PNode s=(PNode)malloc(sizeof(Node));  //我们需要一个新的临时单链表
			s->data1=p->data1;
			s->data2=p->data2;
			r->next=s;
			r=s;
			p=p->next;
		}else if(p->data2==q->data2){   //当指数项相等时
			PNode s=(PNode)malloc(sizeof(Node));
			s->data1=p->data1+q->data1;   
			s->data2=p->data2;
			if(s->data1==0){  //判断两表系数相加是否为零
				free(s);     //为零时释放s
			}else{
				r->next=s;    //不为零时连接到r后面
				r=s;
			}
			p=p->next;
			q=q->next;
		}else{             //q的指数项较小,连接到r后面
			PNode s=(PNode)malloc(sizeof(Node));
			s->data1=q->data1;
			s->data2=q->data2;
			r->next=s;
			r=s;
			q=q->next;
		}		
	}
	if(p){       //最后还是要判断一下哪个表还有剩余元素,放入r后面
		r->next=p;
	}else if(q){
		r->next=q;
	}else{
		r->next=NULL;
	}
	return r;
}

1.3 完整代码

#include<stdio.h>
#include<malloc.h>
typedef struct Node{
	double data1;
	int data2;
	struct Node * next;
}Node,*PNode;
PNode Init_Node(){
	PNode head=(PNode)malloc(sizeof(Node));
	head->next=NULL;
	return head;
}
int Creat_Node(PNode head){
	double a;
	int b;
    PNode p=head;
	while(scanf("%lf %d",&a,&b)==2){
        if(a==0) continue;
		PNode q=(PNode)malloc(sizeof(Node));
		q->data1=a;
		q->data2=b;
		p->next=q;
		p=q;
	}
	p->next=NULL;
	return 1;
}
PNode Connect_Node(PNode head1,PNode head2,PNode head3){
	PNode p,q,r;
	r=head3;
	p=head1->next;
	q=head2->next;
	while(p&&q){
		if(p->data2<q->data2){
			PNode s=(PNode)malloc(sizeof(Node));
			s->data1=p->data1;
			s->data2=p->data2;
			r->next=s;
			r=s;
			p=p->next;
		}else if(p->data2==q->data2){
			PNode s=(PNode)malloc(sizeof(Node));
			s->data1=p->data1+q->data1;
			s->data2=p->data2;
			if(s->data1==0){
				free(s);
			}else{
				r->next=s;
				r=s;
			}
			p=p->next;
			q=q->next;
		}else{
			PNode s=(PNode)malloc(sizeof(Node));
			s->data1=q->data1;
			s->data2=q->data2;
			r->next=s;
			r=s;
			q=q->next;
		}		
	}
	if(p){
		r->next=p;
	}else if(q){
		r->next=q;
	}else{
		r->next=NULL;
	}
	return r;
}
int Print_Node(PNode head){
	PNode p=head->next;
	while(p){
		printf("%lf %d ",p->data1,p->data2);
		p=p->next;
	}
	printf("\n");
	return 1;
}
int main(){
	PNode p,q,r;
	p=Init_Node();
	q=Init_Node();
	r=Init_Node();
	Creat_Node(p);
	getchar();
	Creat_Node(q);
	Connect_Node(p,q,r);
	Print_Node(r);
	return 1;
}

三、运行结果

两个一元多项式相加,# 《 数据结构与算法 》,算法,数据结构

两个一元多项式相加,# 《 数据结构与算法 》,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-737655.html

附:系列文章

序号 文章目录 直达链接
1 顺序表的十个基本操作(全) https://want595.blog.csdn.net/article/details/127139051
2 单链表的十三个基本操作(全) https://want595.blog.csdn.net/article/details/127139598
3 四种创建单链表的方法 https://want595.blog.csdn.net/article/details/127017405
4 删除重复元素(顺序表、单链表) https://want595.blog.csdn.net/article/details/127023468
5 两个有序表的合并(三种方法) https://want595.blog.csdn.net/article/details/127104602
6 一元多项式相加问题(两种方法) https://want595.blog.csdn.net/article/details/127131351
7 约瑟夫环问题(三种方法) https://want595.blog.csdn.net/article/details/127019472
8 顺序栈与链栈 https://want595.blog.csdn.net/article/details/127035609
9 顺序循环队列与链队列 https://want595.blog.csdn.net/article/details/127040115
10 后缀表达式的转换(栈的运用) https://want595.blog.csdn.net/article/details/127088466
11 简单表达式的计算(两种方法) https://want595.blog.csdn.net/article/details/127121720
12 next数组(详细求法) https://want595.blog.csdn.net/article/details/127217629
13 BF算法(具体应用) https://want595.blog.csdn.net/article/details/127138894
14 串的模式匹配相关问题(BF算法、KMP算法) https://want595.blog.csdn.net/article/details/127182721
15 二叉树的遍历(七种方法) https://want595.blog.csdn.net/article/details/127472445

到了这里,关于一元多项式相加问题(两种方法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(41)
  • 【链表应用】| 一元多项式的操作

    专栏推荐:写文章刚刚起步,各个专栏的知识点后续会补充完善,不断更新好文,希望大 家支持一下。 专栏 名字 Elasticsearch专栏 es spring专栏 spring开发 redis专栏 redis学习笔记 项目专栏 项目集锦 修bug专栏 bug修理厂 设有两个一元多项式: p(x)=p0+p1x+p2x2+···+pnxn q(x)=q0+q1x+q2x2+··

    2024年02月06日
    浏览(28)
  • 数据结构(严蔚敏)【一元多项式的运算】【C语言】

    1、一元多项式的运算:实现两个多项式加、减乘运算 设计内容: 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为:用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法; 设计思路: 将顺序表数组下标作为多项式的指数项,数组内的数据元素

    2023年04月15日
    浏览(34)
  • 一元稀疏多项式简单计算器(C语言)含注释

    问题描述 设计一个一元稀疏多项式简单计算器 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; (

    2024年02月08日
    浏览(30)
  • PTA 习题3.6 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(29)
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(37)
  • 题02-线性结构2 一元多项式的乘法与加法运算(C语言)

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(31)
  • 浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月13日
    浏览(36)
  • AA@有理系数多项式@整系数多项式@本原多项式@有理多项式可约问题

    有理数域上一元多项式的因式分解. 作为 因式分解定理 的一个特殊情形,我们有结论: 每个次数大等于1的 有理系数多项式 都能 唯一地 分解成 不可约的有理系数多项式 的乘积. 有理数域版本中,从一般数域具体到了\\\" 有理系数 \\\" 我们讨论多项式的时候,都假设多项式是在某个数

    2024年02月16日
    浏览(37)
  • Math:P问题(多项式时间内可解决)、NP问题(多项式时间内验证)、NPC问题(可通过一个多项式时间算法转换为NP问题)、NP-Hard问题(两不知)的详解与区别之详细攻略

    Math:P问题(多项式时间内可解决)、NP问题(多项式时间内验证)、NPC问题(可通过一个多项式时间算法转换为NP问题)、NP-Hard问题(两不知)的详解与区别之详细攻略 导读 :昨天与圈内几位数学界的大佬,深度探讨了一下P问题、NP问题、NPC问题、NP-Hard问题之间的联系和区别,聊的很

    2024年02月15日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包