多项式加法(用 C 语言实现)

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

目录

一、多项式的初始化

二、多项式的创建

三、多项式的加法

四、多项式的输出

五、清除链表

六、主函数



用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef指数(exp)两个数据域以及一个指针域(next。对应的数据结构定义为:

typedef struct Node
{
    int coef;  // 系数
    int exp;  // 指数
    struct Node* next;
}Node, *Link;

一个多项式可以表示成由这些节点链接起来的单链表。

一、多项式的初始化

单向非循环链表可以分为以下两种:

  1. 不设头结点的单向非循环链表

    多项式加法(用 C 语言实现)

  2. 设头结点的单向非循环链表

    多项式加法(用 C 语言实现)

本次程序采用第二种

void InitPoyln(Link* phead)
{
    assert(phead);  // phead 是指向头指针的指针,是一个二级指针
    *phead = (Node*)malloc(sizeof(Node));  // 生成新节点作为头节点
    if (NULL == *phead)
    {
        perror("initialization failed!");
        exit(-1);
    }
    (*phead)->next = NULL;  // 将头节点的指针域置为空
}

二、多项式的创建

多项式链表是一个有序表  ​,每项的位置都要经过比较才能确定。

void CreatePoyln(Link head, int n)
{
	assert(head);  // 头指针指向头节点
	for (int i = 0; i < n; ++i)
	{
		// 生成新节点
		Node* newnode = (Node*)malloc(sizeof(Node));  
		assert(newnode);
		scanf("%d %d", &newnode->coef, &newnode->exp);
		if (newnode->coef == 0)  // 只保存系数不为 0 的项
		{
			free(newnode);
			continue;
		}
		newnode->next = NULL;
		// 插入
		Node* prev = head;
		Node* cur = head->next;
		while (cur != NULL)
		{
			if (cur->exp == newnode->exp)
			{
				// 合并 cur 和 newnode
				int sum = cur->coef + newnode->coef;
				if (sum != 0)
				{
					cur->coef = sum;
					free(newnode);
				}
				else
				{
					prev = cur->next;
					Node* tmp = cur;
					cur = cur->next;
					free(tmp);
					free(newnode);
				}
				break;
			}
			else if (cur->exp > newnode->exp)
			{
				prev = cur;
				cur = cur->next;
			}
			else  // cur->exp < newnode->exp
			{
				// 将 newnode 插入到 prev 和 cur 之间
				prev->next = newnode;
				newnode->next = cur;
				break;
			}
		}
		if (cur == NULL)
		{
			prev->next = newnode;
		}
	}
}

三、多项式的加法

void AddPolyn(Link headA, Link headB)
{
	assert(headA != NULL && headB != NULL);
	Node* tail = headA;
	Node* curA = headA->next;
	Node* curB = headB->next;
	while (curA && curB)
	{
		if (curA->exp == curB->exp)
		{
			int sum = curA->coef + curB->coef;
			if (sum != 0)
			{
				curA->coef = sum;
				tail->next = curA;
				tail = curA;
				curA = curA->next;
                
				Node* tmp = curB;
				curB = curB->next;
				free(tmp);
			}
			else
			{
				Node* tmp = curA;
				curA = curA->next;
				free(tmp);
				tmp = curB;
				curB = curB->next;
				free(tmp);
			}
		}
		else if (curA->exp > curB->exp)
		{
			tail->next = curA;
			tail = curA;
			curA = curA->next;
		}
		else  // curA->exp < curB->exp
		{
			tail->next = curB;
			tail = curB;
			curB = curB->next;
		}
	}
	tail->next = curA ? curA : curB;
	free(headB);  // 释放 headB 指向的头节点
}

四、多项式的输出

void PrintPolyn(Link head)
{
	assert(head);
	Node* cur = head->next;
	int first = 1;
	while (cur != NULL)
	{
		// 输出正负号
		if (first)
		{
			if (cur->coef < 0)
				printf("%c", '-');
			first = 0;
		}
		else
		{
			if (cur->coef < 0)
				printf("%c", '-');
			else
				printf("%c", '+');
		}

		// 输出系数的绝对值
		if ((cur->exp > 0 && cur->coef != 1) || cur->exp == 0)
			printf("%d", abs(cur->coef));

		// 输出自变量 x
		if (cur->exp > 0)
			printf("%c", 'x');

		// 输出 ^exp
		if (cur->exp > 1)
			printf("%c%d", '^', cur->exp);

		cur = cur->next;  // 指向多项式的下一项
	}
	printf("\n");
}

五、清除链表

void ClearLink(Link head)
{
	assert(head);
	Node* cur = head->next;
	while (cur != NULL)
	{
		Node* tmp = cur;
		cur = cur->next;
		free(tmp);
	}
	free(head);
}

六、主函数

#include "Polyn.h"

int main()
{
	Link headA;
	Link headB;
	InitPoyln(&headA);
	InitPoyln(&headB);

	int nA = 0;
	int nB = 0;
	scanf("%d", &nA);
	CreatePoyln(headA, nA);
	printf("第一个多项式为:");
	PrintPolyn(headA);

	scanf("%d", &nB);
	CreatePoyln(headB, nB);
	printf("第二个多项式为:");
	PrintPolyn(headB);

	AddPolyn(headA, headB);
	printf("两个多项式的和为:");
	PrintPolyn(headA);

	ClearLink(headA);
	return 0;
}
  1. 样例输入 1

    4
    3 2
    4 5
    1 1
    2 3
    3
    -3 2
    -4 5
    2 4

    样例输出 1

    第一个多项式为:4x^5+2x^3+3x^2+x
    第二个多项式为:-4x^5+2x^4-3x^2
    两个多项式的和为:2x^4+2x^3+x
  2. 样例输入 2

    2
    0 1
    2 3
    3
    2 6
    3 9
    4 3

    样例输出 2

    第一个多项式为:2x^3
    第二个多项式为:3x^9+2x^6+4x^3
    两个多项式的和为:3x^9+2x^6+6x^3
  3. 样例输入 3

    3
    4 2
    -2 2
    -1 2
    2
    0 2
    6 2

    样例输出 3

    第一个多项式为:x^2
    第二个多项式为:6x^2
    两个多项式的和为:7x^2
     

创作不易,可以点点赞,如果能关注一下博主就更好了~文章来源地址https://www.toymoban.com/news/detail-428892.html

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

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

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

相关文章

  • 浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

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

    2024年02月13日
    浏览(36)
  • 【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

    本次代码纯c语言,可以支持输入两个多项式的项式、系数、指数。 实验目的: 1 掌握单链表的基本工作原理; 2 实现链式存储下的两个多项式的相加。 实验步骤 1 定义链式存储的数据结构 2 完成多项式的初始化,即给多项式赋初值 3 完成多项式的输出 4 实现多项式的相加及结

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

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

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

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

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

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

    2024年02月01日
    浏览(41)
  • 使用R语言进行多项式回归、非线性回归模型曲线拟合

    对于线性关系,我们可以进行简单的线性回归。对于其他关系,我们可以尝试拟合一条曲线。 相关视频 曲线拟合是构建一条曲线或数学函数的过程,它对一系列数据点具有最佳的拟合效果。 使用示例数据集 看起来我们可以拟合一条曲线。 我们可以看到每条曲线的拟合程度

    2024年02月09日
    浏览(24)
  • 数学建模--多项式拟合方法Python实现

    目录    1.算法设计思路  2.算法核心代码  3.算法效果展示 1.算法设计思路  2.算法核心代码  3.算法效果展示

    2024年02月07日
    浏览(30)
  • 数学建模--非多项式拟合法的Python实现

    目录   1.算法异同区别   2.算法核心步骤   3.算法核心代码   4.算法效果展示 1.算法异同区别   2.算法核心步骤   3.算法核心代码   4.算法效果展示

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

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

    2024年02月16日
    浏览(37)
  • Python实现离散选择多项式对数模型(MNLogit算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 多项式对数模型是离散选择模型的一种。 本项目通过MNLogit算法来构建多项式对数模型。   本次建模数据来源于网络(本项目撰写人整理而成),数

    2024年01月23日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包