C语言实现两个多项式相加&相减&相乘运算

实现两个多项式相加&相减运算

  • 算法思路:创建两个链表,其中包含数据域(系数、指数),以及指向下一个结点的指针域。将两个多项式链表按照指数递减的规则排序,对比两个链表中的数据,如果指数相等则进行相加/相减操作,如果指数不相等则复制该结点的值。
#include<stdio.h>
#include<malloc.h>
#define MAX 100  //多项式最多项数
typedef struct
{
	double coef; //系数
	int exp; //指数
}PolyArray; //存放多项式的数组类型

typedef struct pnode
{
	double coef; //系数
	int exp; //指数
	struct pnode* next;
}PolyNode; //声明多项式单链表结点类型

void CreatePolyR(PolyNode*& L, PolyArray a[], int n) //尾插法建表
{
	PolyNode* s, * r;
	int i;
	L = (PolyNode*)malloc(sizeof(PolyNode));
	L->next = NULL;
	r = L; //r始终指向尾结点,开始时指向头结点
	for (i = 0; i < n; i++)
	{
		s = (PolyNode*)malloc(sizeof(PolyNode)); //创建新结点
		s->coef = a[i].coef;
		s->exp = a[i].exp;
		r->next = s; //将结点s插入到结点r之后
		r = s;
	}
	r->next = NULL; //尾结点next域置为NULL
}

void DispPoly(PolyNode* L) //输出多项式单链表
{
	PolyNode* p = L->next;
	while (p != NULL)
	{
		if (p->coef > 0) printf("+");//系数为正,用+连接	
		if (p->exp == 0) printf("%g", p->coef); //指数为0,只输出系数
		else if (p->exp == 1) printf("%gx", p->coef); //指数为1
		else printf("%gx^%d", p->coef, p->exp); //指数不为1
		p = p->next;
	}
	printf("\n");
}

void DestoryPoly(PolyNode*& L) //销毁多项式单链表
{
	PolyNode* pre = L, * p = pre->next;
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

void Sort(PolyNode*& L) //将多项式单链表按指数递减排序
{
	PolyNode* p = L->next, * pre, * q;
	if (p != NULL) //L有一个或以上的数据结点
	{
		q = p->next; //q保存p结点的后继节点
		p->next = NULL; //构造只含一个数据结点的有序表
		p = q;
		while (p != NULL) //扫描原L中余下的数据结点
		{
			q = p->next; //q保存p结点的后继节点
			pre = L;
			while (pre->next != NULL && pre->next->exp > p->exp)
				pre = pre->next; //在有序表中找插入节点p的前驱结点pre
			p->next = pre->next; //将结点p插入到结点pre之后
			pre->next = p;
			p = q; //扫描原单链表余下的结点
		}
	}
}

void Add(PolyNode* ha, PolyNode* hb, PolyNode*& hc)  //ha和hb相加得到hc
{
	PolyNode* pa = ha->next, * pb = hb->next, * s, * r;
	double c;
	hc = (PolyNode*)malloc(sizeof(PolyNode));
	r = hc; //r指向尾结点,初始时指向头结点
	while (pa != NULL && pb != NULL) //pa、pb均没有扫描完
	{
		if (pa->exp > pb->exp) //将指数较大的pa结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pa->exp;
			s->coef = pa->coef;
			r->next = s;
			r = s;
			pa = pa->next;
		}
		else if(pa->exp < pb->exp) //将指数较大的pb结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pb->exp;
			s->coef = pb->coef;
			r->next = s;
			r = s;
			pb = pb->next;
		}
		else //pa、pb结点的指数相等时
		{
			c = pa->coef + pb->coef; //求两个结点的系数和c
			if (c != 0) //若系数和不为0时创建新结点
			{
				s = (PolyNode*)malloc(sizeof(PolyNode)); 
				s->exp = pa->exp;
				s->coef = c;
				r->next = s;
				r = s;
			}
			pa = pa->next; //pa后移一个结点
			pb = pb->next; //pb后移一个结点
		}
	}
	if (pb != NULL) pa = pb; //复制余下的结点
	while (pa != NULL)
	{
		s = (PolyNode*)malloc(sizeof(PolyNode));
		s->exp = pa->exp;
		s->coef = pa->coef;
		r->next = s;
		r = s;
		pa = pa->next;
	}
	r->next = NULL; //尾结点next设置为空
}

void Sub(PolyNode* ha, PolyNode* hb, PolyNode*& hd)  //ha和hb相加得到hc
{
	PolyNode* pa = ha->next, * pb = hb->next, * s, * r;
	double c;
	hd = (PolyNode*)malloc(sizeof(PolyNode));
	r = hd; //r指向尾结点,初始时指向头结点
	while (pa != NULL && pb != NULL) //pa、pb均没有扫描完
	{
		if (pa->exp > pb->exp) //将指数较大的pa结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pa->exp;
			s->coef = pa->coef;
			r->next = s;
			r = s;
			pa = pa->next;
		}
		else if (pa->exp < pb->exp) //将指数较大的pb结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pb->exp;
			s->coef = 0-pb->coef;
			r->next = s;
			r = s;
			pb = pb->next;
		}
		else //pa、pb结点的指数相等时
		{
			c = pa->coef - pb->coef; //求两个结点的系数和c
			if (c != 0) //若系数相减不为0时创建新结点
			{
				s = (PolyNode*)malloc(sizeof(PolyNode));
				s->exp = pa->exp;
				s->coef = c;
				r->next = s;
				r = s;
			}
			pa = pa->next; //pa后移一个结点
			pb = pb->next; //pb后移一个结点
		}
	}
	if (pb != NULL) pa = pb; //复制余下的结点
	while (pa != NULL)
	{
		s = (PolyNode*)malloc(sizeof(PolyNode));
		s->exp = pa->exp;
		s->coef = pa->coef;
		r->next = s;
		r = s;
		pa = pa->next;
	}
	r->next = NULL; //尾结点next设置为空
}

int main()
{
	PolyNode* ha, * hb, * hc, * hd;
	PolyArray a[] = { {3,1},{2,0},{1,3},{4,4} };
	PolyArray b[] = { {3,4},{2,3},{1,0},{5,2},{ 3,6} };
	CreatePolyR(ha, a, 4);
	CreatePolyR(hb, b, 5);
	printf("原多项式A:");
	DispPoly(ha);
	printf("\n");
	printf("原多项式B:");
	DispPoly(hb);
	printf("\n");
	Sort(ha);
	Sort(hb);
	printf("有序多项式A:");
	DispPoly(ha);
	printf("\n");
	printf("有序多项式B:");
	DispPoly(hb);
	printf("\n");

	Add(ha, hb, hc);
	printf("多项式相加:");
	DispPoly(hc);
	printf("\n");

	Sub(ha, hb, hd);
	printf("多项式相减:");
	DispPoly(hd);
	printf("\n");
	/*DestoryPoly(ha);
	DestoryPoly(hb);
	DestoryPoly(hc);*/
	return 0;
}

程序分析:

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

实现两个多项式相乘

  • 算法思路:创建两个链表,其中包含数据域(系数、指数),以及指向下一个结点的指针域。将链表中数据域进行相乘后得到新的链表,将新链表按照指数递减的规则排序。定义两个指针,一个指向首结点,一个指向第二个结点,如果前一个结点的指数与下一个结点的指数相等,则将两个结点的系数相加,释放掉一个结点。两个多项式相乘可能会出现系数为0的项,最后要进行删除。
void Mul(PolyNode* ha, PolyNode* hb, PolyNode*& hc)  //ha和hb相加得到hc
{
	PolyNode* pa = ha->next, * pb, * s, * tc;
	hc = (PolyNode*)malloc(sizeof(PolyNode));
	tc = hc;
	while (pa != NULL)
	{
		pb = hb->next;
		while (pb != NULL)
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->coef = pa->coef * pb->coef;
			s->exp = pa->exp + pb->exp;
			tc->next = s;
			tc = s;
			pb = pb->next;
		}
		pa = pa->next;
	}
	tc->next = NULL;
}

void Comb(PolyNode*& L) //合并指数相同的项
{
	PolyNode* pre = L->next, * p;
	if (pre == NULL) return;
	p = pre->next;
	while (p != NULL)
	{
		while (p->exp == pre->exp)
		{
			pre->coef += p->coef;
			pre->next = p->next;
			free(p);
			p = pre->next;
		}
		pre = p;
		p = p->next;
	}
}

void DelZero(PolyNode*& L) //删除系数为0的项
{
	PolyNode* pre = L, * p = pre->next;
	while (p != NULL)
	{
		if (p->coef == 0.0)
		{
			pre->next = p->next;
			free(p);
		}
		pre = p;
		p = p->next;
	}
}

Mul(ha, hb, hc);
Sort(hc);
Comb(hc);
DelZero(hc);

程序分析:

  • 运行结果:
    在这里插入图片描述
  • 10
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,以下是一个基于单链表储存一元多项式C语言程序,并实现两个多项式相加运算: ```c #include <stdio.h> #include <stdlib.h> // 定义多项式结构体 typedef struct PolyNode { int coef; // 系数 int expon; // 指数 struct PolyNode* next; // 指向下一个结点的指针 } PolyNode, *Polynomial; // 创建一个空的多项式 Polynomial CreatePoly() { Polynomial P = (Polynomial)malloc(sizeof(PolyNode)); if (!P) { printf("内存分配失败!\n"); exit(1); } P->next = NULL; return P; } // 释放多项式所占用的内存 void DestroyPoly(Polynomial P) { Polynomial temp; while (P) { temp = P; P = P->next; free(temp); } } // 将项插入多项式 void InsertItem(Polynomial P, int coef, int expon) { Polynomial temp, pre, newnode; pre = P; temp = pre->next; while (temp && temp->expon > expon) { pre = temp; temp = pre->next; } if (temp && temp->expon == expon) { temp->coef += coef; if (temp->coef == 0) { pre->next = temp->next; free(temp); } } else { newnode = (Polynomial)malloc(sizeof(PolyNode)); if (!newnode) { printf("内存分配失败!\n"); exit(1); } newnode->coef = coef; newnode->expon = expon; newnode->next = temp; pre->next = newnode; } } // 读入多项式 Polynomial ReadPoly() { Polynomial P = CreatePoly(); int n, coef, expon; scanf("%d", &n); while (n--) { scanf("%d %d", &coef, &expon); InsertItem(P, coef, expon); } return P; } // 求两个多项式的和 Polynomial AddPoly(Polynomial P1, Polynomial P2) { Polynomial P = CreatePoly(); Polynomial temp1 = P1->next, temp2 = P2->next; while (temp1 && temp2) { if (temp1->expon > temp2->expon) { InsertItem(P, temp1->coef, temp1->expon); temp1 = temp1->next; } else if (temp1->expon < temp2->expon) { InsertItem(P, temp2->coef, temp2->expon); temp2 = temp2->next; } else { InsertItem(P, temp1->coef + temp2->coef, temp1->expon); temp1 = temp1->next; temp2 = temp2->next; } } while (temp1) { InsertItem(P, temp1->coef, temp1->expon); temp1 = temp1->next; } while (temp2) { InsertItem(P, temp2->coef, temp2->expon); temp2 = temp2->next; } return P; } // 输出多项式 void PrintPoly(Polynomial P) { Polynomial temp = P->next; int flag = 0; // 标记是否为第一项 if (!temp) { printf("0 0\n"); return; } while (temp) { if (!flag) { flag = 1; } else { printf(" "); } printf("%d %d", temp->coef, temp->expon); temp = temp->next; } printf("\n"); } int main() { Polynomial P1, P2, P; P1 = ReadPoly(); P2 = ReadPoly(); P = AddPoly(P1, P2); PrintPoly(P); DestroyPoly(P1); DestroyPoly(P2); DestroyPoly(P); return 0; } ``` 上述程序中,我们定义了一个多项式结构体,并实现了创建一个空的多项式、将项插入多项式、读入多项式、释放多项式、求两个多项式的和、输出多项式等基本操作。在主函数中,我们读入两个多项式,并通过AddPoly函数求它们的和,最后输出结果并释放内存。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值