多项式相加(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;
}
  • 21
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
链表是一种常用的数据结构,可以用来实现稀疏多项式相加。在C语言中,可以通过定义一个结构体来表示多项式的每一项,然后使用链表将这些项连接起来。 首先,我们可以定义一个结构体来表示多项式的每一项,包括系数和指数: ```c typedef struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一个节点的指针 } Node; ``` 然后,我们可以定义一个函数来创建一个新的节点: ```c Node* createNode(int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; return newNode; } ``` 接下来,我们可以定义一个函数来将节点插入到链表中的正确位置: ```c void insertNode(Node** head, Node* newNode) { if (*head == NULL || (*head)->exponent < newNode->exponent) { newNode->next = *head; *head = newNode; } else { Node* current = *head; while (current->next != NULL && current->next->exponent > newNode->exponent) { current = current->next; } newNode->next = current->next; current->next = newNode; } } ``` 最后,我们可以定义一个函数实现两个多项式相加: ```c Node* addPolynomials(Node* poly1, Node* poly2) { Node* result = NULL; while (poly1 != NULL && poly2 != NULL) { if (poly1->exponent > poly2->exponent) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } else if (poly1->exponent < poly2->exponent) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } else { int sum = poly1->coefficient + poly2->coefficient; if (sum != 0) { insertNode(&result, createNode(sum, poly1->exponent)); } poly1 = poly1->next; poly2 = poly2->next; } } while (poly1 != NULL) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } while (poly2 != NULL) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } return result; } ``` 这样,我们就可以通过调用上述函数实现稀疏多项式相加了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谛凌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值