【多项式相乘C语言实现】

一. SeqList.h头文件(所有函数声明及结构体定义)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>	

typedef struct polyn
{
	float coef; //一元多项式的系数
	int expn; //一元多项式的指数
	struct polyn* next;
}PolyNode, *PLinkList;

PLinkList CreatePolyn();
PolyNode* Reverse(PLinkList h);
PolyNode* MultiplyPolyn(PLinkList A, PLinkList B);
void OutPut(PLinkList h

二. SeqList.c(函数模块)

#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"

PLinkList CreatePolyn() //创建一元多项式,使一元多项式呈指数递减
{
	PolyNode* p, * q, * s;
	PolyNode* h = NULL;
	int expn2;
	float coef2;
	h = (PLinkList)malloc(sizeof(PolyNode)); //动态生成一个头节点
	if (!h)
	{
		return NULL;
	}
	h->coef = 0;
	h->expn = 0;
	h->next = NULL;
	do
	{
		printf("输入系数coef(系数和指数都为0时,表示结束)");
		scanf("%f", &coef2);
		printf("输入指数exp(系数和指数都为0时,表示结束)");
		scanf("%d", &expn2);
		if ((long)coef2 == 0 && expn2 == 0)
			break;
		s = (PolyNode*)malloc(sizeof(PolyNode));
		if (!s)
		{
			return NULL;
		}
		s->expn = expn2;
		s->coef = coef2;
		q = h->next; //指向链表的第一个节点,即表尾
		p = h; //*p指向q的前驱结点
		while (q && expn2 < q->expn)//将新输入的指数与q指向的结点指数比较
		{
			p = q;
			q = q->next;
		}
		if (q == NULL || expn2 > q->expn)//*q指向要插入结点的位置,p指向要插入结点的前驱结点
		{
			p->next = s;//将s结点插入到链表中
			s->next = q;
		}
		else
		{
			q->coef += coef2;//如果指数与链表中结点指数相同,则将系数相加即可
		}
	} while (1);
	return h;
}

PolyNode* Reverse(PLinkList h)//将生成的链表逆置,使一元多项式呈指数递增形式
{
	PolyNode* q, * r, * p = NULL;
	q = h->next;
	while (q)
	{
		r = q->next;//r指向链表的待处理结点
		q->next = p;//将链表结点逆置
		p = q;//p指向刚逆置后链表结点
		q = r;//q指向下一准备逆置的结点
	}
	h->next = p;//将头结点的指针指向已经逆置后的链表
	return h;
}

PolyNode* MultiplyPolyn(PLinkList A, PLinkList B)
{
	PolyNode* pa, * pb, * pc, * u, * h;
	int k, maxExp;
	float coef;
	h = (PLinkList)malloc(sizeof(PolyNode));//动态生成头结点
	if (!h)
	{
		return NULL;
	}
	h->coef = 0.0;
	h->expn = 0;
	h->next = NULL;
	if (A->next != NULL && B->next != NULL)
	{
		maxExp = A->next->expn + B->next->expn;//为两个链表指数的和的最大值
	}
	else
		return h;
	pc = h;
	B = Reverse(B);//使多项式的乘积指数范围为0-maxExp
	for (k = maxExp; k >= 0; k--)
	{
		pa = A->next;
		while (pa != NULL && pa->expn > k)//从pa指向的多项式中指数小于k的结点开始查找
		{
			pa = pa->next;
		}
		pb = B->next;
		while (pb != NULL && pa != NULL && pa->expn + pb->expn < k)//如果指数之和小于k,使pb移到下一个结点
			pb = pb->next;
		coef = 0.0;
		while (pa != NULL && pb != NULL)
		{
			if (pa->expn + pb->expn == k)//如果在链表中找到对应的结点,即指数之和等于k,求相应的系数
			{
				coef += pa->coef * pb->coef;
				pa = pa->next;
				pb = pb->next;
			}
			else if (pa->expn + pb->expn > k)//如果指数之和大一k,使pa移到下一个节点
				pa = pa->next;
			else
				pb = pb->next;//如果指数之和小于k,使pb移到下一个节点
		}
		if (coef != 0.0)//如果系数不为零,则生成新节点,并将系数和指数分别赋值给新节点,并将结点插入到链表中
		{
			u = (PolyNode*)malloc(sizeof(PolyNode));
			u->coef = coef;
			u->expn = k;
			u->next = pc->next;
			pc->next = u;
			pc = u;
		}
	}
	B = Reverse(B);//完成多项式乘积后,将B(x)呈指数递减形式
	return h;
}

void OutPut(PLinkList h) // 输出一元多项式
{
	PolyNode* p = h->next;
	while (p)
	{
		printf("%1.1lf", p->coef);
		if (p->expn)
		{
			printf("x^%d", p->expn);
		}
		if (p->next && p->next->coef > 0)
		{
			printf("+");
		}
		p = p->next;
	}
}

三. test.c(测试程序)

#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"

int main()
{
	PLinkList A, B, C;
	A = CreatePolyn();
	printf("A(x)=");
	OutPut(A);
	printf("\n");
	B = CreatePolyn();
	printf("B(x)=");
	OutPut(B);
	printf("\n");
	C = MultiplyPolyn(A, B);
	printf("C(x)=A(x)*B(x)=");
	OutPut(C); //输出结果
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述

小编制作不易,如果觉得对你有帮助的话,麻烦留下你一个小小的赞

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
链表是一种常用的数据结构,可以用来实现多项式的存储和操作。在C语言中,可以通过定义一个结构体来表示多项式的每一项,然后使用链表将这些项连接起来。 首先,我们可以定义一个结构体来表示多项式的每一项,包括系数和指数: ```c struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一个节点的指针 }; ``` 然后,我们可以定义一个函数来创建一个空的多项式链表: ```c struct Node* createPolynomial() { return NULL; } ``` 接下来,我们可以定义一个函数来向多项式链表中插入一项: ```c void insertTerm(struct Node** polynomial, int coefficient, int exponent) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; if (*polynomial == NULL) { *polynomial = newNode; } else { struct Node* current = *polynomial; while (current->next != NULL) { current = current->next; } current->next = newNode; } } ``` 然后,我们可以定义一个函数来打印多项式链表: ```c void printPolynomial(struct Node* polynomial) { struct Node* current = polynomial; while (current != NULL) { printf("%dx^%d ", current->coefficient, current->exponent); current = current->next; } printf("\n"); } ``` 最后,我们可以定义一个函数来实现两个多项式的相乘: ```c struct Node* multiplyPolynomials(struct Node* poly1, struct Node* poly2) { struct Node* result = createPolynomial(); struct Node* current1 = poly1; while (current1 != NULL) { struct Node* current2 = poly2; while (current2 != NULL) { int coefficient = current1->coefficient * current2->coefficient; int exponent = current1->exponent + current2->exponent; insertTerm(&result, coefficient, exponent); current2 = current2->next; } current1 = current1->next; } return result; } ``` 使用上述定义的函数,我们可以实现两个多项式的相乘。以下是一个示例程序: ```c #include <stdio.h> #include <stdlib.h> struct Node { int coefficient; int exponent; struct Node* next; }; struct Node* createPolynomial() { return NULL; } void insertTerm(struct Node** polynomial, int coefficient, int exponent) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; if (*polynomial == NULL) { *polynomial = newNode; } else { struct Node* current = *polynomial; while (current->next != NULL) { current = current->next; } current->next = newNode; } } void printPolynomial(struct Node* polynomial) { struct Node* current = polynomial; while (current != NULL) { printf("%dx^%d ", current->coefficient, current->exponent); current = current->next; } printf("\n"); } struct Node* multiplyPolynomials(struct Node* poly1, struct Node* poly2) { struct Node* result = createPolynomial(); struct Node* current1 = poly1; while (current1 != NULL) { struct Node* current2 = poly2; while (current2 != NULL) { int coefficient = current1->coefficient * current2->coefficient; int exponent = current1->exponent + current2->exponent; insertTerm(&result, coefficient, exponent); current2 = current2->next; } current1 = current1->next; } return result; } int main() { struct Node* poly1 = createPolynomial(); insertTerm(&poly1, 2, 2); insertTerm(&poly1, 3, 1); insertTerm(&poly1, 4, 0); struct Node* poly2 = createPolynomial(); insertTerm(&poly2, 5, 1); insertTerm(&poly2, 6, 0); printf("多项式1:"); printPolynomial(poly1); printf("多项式2:"); printPolynomial(poly2); struct Node* result = multiplyPolynomials(poly1, poly2); printf("相乘结果:"); printPolynomial(result); return 0; } ``` 希望以上代码能够帮助你理解如何使用链表来实现两个多项式的相乘。如果有任何疑问,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

维生素C++

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值