多项式相加(C语言版 链表版+数组版)

多项式相加

【问题描述】

编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:

多项式A: 1.2X0 + 2.5X1 + 3.2X3 - 2.5X5
多项式B: -1.2X0 + 2.5X1 + 3.2X3 + 2.5X5 + 5.4X10
多项式A与B之和:5.4X10 + 6.4X3 + 5X1

【输入形式】

任意两个多项式A和B

【输出形式】

多项式中某一项的系数与指数,系数保留一位小数

【输入样例】

1.2 0 2.5 1 3.2 3 -2.5 5
-1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2

【输出样例】

6.4 3

【样例说明】
第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数

分析

  • 此题的实现分为两个版本:数组版本与链表版本。
  • 数组版本的思想是通过一维数组来储存多项式的系数与指数,指数作为数组的索引,而系数则作为数组索引对应的数值。
  • 链表版本则是通过包含指数、系数、下一节点指针的结构体,按照顺序读取数据,当新读取的数据是出现过的指数时,则将其对应的系数相加;如果不相等,则按照由大到小的顺序,对链表实行插入操作,以此来使链表是按照多项式的指数由大到小进行排序。
  • 需要注意的是,本题并没有指定每一行数据的个数,因此何时停止获取输入便成了一个问题,本人采取的做法是:由于数据通过空格分隔,因此每次通过scanf获取两个数据,然后通过getchar获取下一个字符,如果下一个字符不是空格,则说明本行已经没有数据了,便可以结束本行的数据读取。

代码

链表版

#include<stdio.h>
#include<stdlib.h>
#define max 1000

typedef struct NODE* Node;
struct NODE {
	int x1;    //指数
	float x2;   //系数
	Node next;
};

Node init(int x1, float x2)
{
	Node n = (Node)malloc(sizeof(struct NODE));
	n->x1 = x1;
	n->x2 = x2;
	n->next = NULL;
	return n;
}

Node insert(Node H, Node r)
{
	Node p = H;
	int flag = 0;
	if (!H->next) {   //链表空状态
		H->next = r;
		return H;
	}
	while (p->next) {
		Node q = p->next;
		if (q->x1 > r->x1) {   //若新数据的指数较小,则往后放
			p = p->next;
			continue;
		}
		else if (q->x1 == r->x1) q->x2 = q->x2 + r->x2;   //两数据的指数相同时,其系数相加
		else if (q->x1 < r->x1) {   //新数据的指数大,则插入该节点前面
			r->next = p->next;
			p->next = r;
		}
		flag++;
		break;
	}
	if (!flag) p->next = r;   //遍历完链表,则将新数据插入到最后一个节点
	return H;
}

Node creat(Node H)
{
	int i;
	for (i = 0; i < max; i++) {
		float t1;
		int t2;
		scanf("%f %d", &t1, &t2);
		Node p = init(t2, t1);
		H = insert(H, p);
		char c = getchar();    //字符为空格时才会继续读取数据
		if (c != ' ') break;
	}
	return H;
}

void output(Node H, int index)
{
	int i = 0;
	Node p = H;
	while(1){
		i++;
		p = p->next;
		if (p->x2 == 0) i--;    //系数为0的项不计数
		if (i == index) {
			printf("%.1f %d", p->x2, p->x1);
			break;
		}
	}
}

int main()
{
	Node H = init(0, 0);
	H = creat(H);
	H = creat(H);
	int index;
	scanf("%d", &index);
	output(H, index);
	return 0;
}

数组版

#include<stdio.h>
#define max 1000
float a1[1005], a2[1005], a3[1005];

void print(float a[], int maxsize, int index)
{
	int i, flag = 0;
	for (i = maxsize; i >= 0; --i) {
		if (a[i]) flag++;   //找到期望输出的索引
		if (flag == index) {
			printf("%.1f %d", a[i], i);
			break;
		}
	}
}

void input(float* t)
{
	int i, t2;
	float t1;
	for (i = 0; i < max; i++) {
		scanf("%f %d", &t1, &t2);
		t[t2] = t1;
		char c = getchar();
		if (c != ' ') break;
	}
}

int main()
{
	int i, index;
	input(a1);
	input(a2);
	scanf("%d", &index);
	for (i = 0; i <= max; i++)
		a3[i] = a1[i] + a2[i];   //对应系数相加
	print(a3, max, index);
	return 0;
}
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谛凌

本人水平有限,感谢您支持与指正

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值