一元多项式加减乘操作

C语言实现一元多项式加减乘(有菜单)

工具:vc++
 

表示一元多项式的数据结构


       把一元多项式看成一个单链表,一元多项式单个项就可以看成单链表的其中一个结点,结点有数据域和指针域,其中数据域包含系数指数,下面第一个就是数据域的结构体类型。

typedef struct{
	float coef;//系数
	int expn;//指数
}term,ElemType;

一元多项式的结点结构

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;//数据结构单链表定义

加减乘各个功能代码实现

 
一元多项式相加(函数AddPolyn

void AddPolyn(polynomial &pa, polynomial &pb){ 
	polynomial a = pa->next;
	polynomial b = pb->next;
	polynomial c = pa;
	while(a && b){
		if(a->data.expn <= b->data.expn){
			if(a->data.expn == b->data.expn){
				a->data.coef += b->data.coef;
				b = b->next;
			}
			c->next = a;
			c = c->next;
			a = a->next;
		}else {
			c->next = b;
			c = c->next;
			b = b->next;
		}
	}
	if(a) {
		c->next = a;
	}else if(b) {
		c->next = b;
	}
	ReformPolyn(pa);
}//完成多项式相加运算,pa = pa + pb ,并销毁一元多项式 pb

一元多项式相减(函数SubtractPolyn

void SubtractPolyn(polynomial &pa, polynomial &pb){
	polynomial a = pa->next;
	polynomial b = pb->next;
	polynomial c = pa;
	while(a && b){
		if(a->data.expn <= b->data.expn){
			if(a->data.expn == b->data.expn){
				a->data.coef -= b->data.coef;
				b = b->next;
			}
			c->next = a;
			c = c->next;
			a = a->next;
		}else {
			b->data.coef *= -1;
			c->next = b;
			c = c->next;
			b = b->next;
		}
	}
	if(a) {
		c->next = a;
	}else if(b) {
		b->data.coef *= -1;
		c->next = b;
	}
	ReformPolyn(pa);
}//完成多项式相减运算,pa = pa - pb ,并销毁一元多项式 pb

一元多项式相乘(函数MultiplyPolyn

void MultiplyPolyn(polynomial &pa, polynomial &pb){
	polynomial t = (polynomial)malloc(sizeof(polynomial));
	t->next = NULL;
	polynomial b;
	b = pb->next;
	while(b){
		polynomial p = copy(pa);
		polynomial q = p->next;
		while(q){
			q->data.coef *= b->data.coef;
			q->data.expn += b->data.expn;
			q = q->next;
		}
		AddPolyn(t,p);
		b = b->next;
	}
	pa->next = t->next;
}//完成多项式相乘运算,pa = pa * pb ,并销毁一元多项式 pb

完整代码

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;

typedef struct{
	float coef;//系数
	int expn;//指数
}term,ElemType;

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;//数据结构单链表定义

typedef LinkList polynomial;

void ReformPolyn(polynomial &p){
	polynomial t = p;
	while(t->next){
		if(t->next->data.coef == 0){
			t->next = t->next->next;
		}else {
			t = t->next;
		}
	}
}//删除系数为0的项

void CreatPolyn(polynomial &p,int m){
	p = (polynomial)malloc(sizeof(polynomial));
	p->next = NULL;
	for(int i = 0;i < m;i++){
		polynomial t = (polynomial)malloc(sizeof(polynomial));
		printf("请输入系数和指数:");
		scanf("%f%d",&(t->data.coef),&(t->data.expn));
		if(t->data.coef != 0) {
			t->next = p->next;
			p->next = t;
		}
	}

	polynomial t = p->next;
	while(t){
		polynomial q = t->next;
		while(q){
			if(t->data.expn > q->data.expn){
				ElemType e;
				e.coef = q->data.coef;
				e.expn = q->data.expn;
				q->data = t->data;
				t->data = e;
			}
			q = q->next;
		}
		t = t->next;
	}//按指数排序

	t = p->next;
	while(t){
		if(t->next && t->data.expn == t->next->data.expn){
			t->data.coef += t->next->data.coef;
			t->next = t->next->next;
		}
		t = t->next;
	}//合并相同指数项

}//建立表示一元多项式的有序链表P

void DestroyPolyn(polynomial p){
	while(p){
		polynomial q = p;
		p = p->next;
		free(q);
	}
}//销毁一元二次多项式

void PrintPolyn(polynomial p){
	printf("y = ");
	polynomial q = p;
	q = q->next;
	while(q){
		if(q!=p->next && q->data.coef > 0)
			printf(" + ");
		else if(q->data.coef < 0)
			printf(" - ");
		if(q->data.coef == (int)q->data.coef) { //如果系数为整数则省略小数点
			if(q->data.expn){ //如果指数为0则为常数项,应该把后面的x^0去掉
				if(q->data.coef != 1) //如果系数为1则省略
					printf("%.0fx^%d",fabs(q->data.coef),q->data.expn);
				else
					printf("x^%d",q->data.expn);
			}else
				printf("%.0fx",fabs(q->data.coef));
		}
		else{ //如果系数不为整数则保留一位小数点
			if(q->data.expn)
				printf("%.1fx^%d",fabs(q->data.coef),q->data.expn);
			else
				printf("%.1fx",fabs(q->data.coef));
		}
		q = q->next;
	}
	printf("\n");
}//打印输出一元多项式

int PolynLength(polynomial p){
	int r = 0;
	polynomial t = p->next;
	while(t){
		r++;
		t = t->next;
	}
	return r;
}//返回一元多项式的项数

void AddPolyn(polynomial &pa, polynomial &pb){ 
	polynomial a = pa->next;
	polynomial b = pb->next;
	polynomial c = pa;
	while(a && b){
		if(a->data.expn <= b->data.expn){
			if(a->data.expn == b->data.expn){
				a->data.coef += b->data.coef;
				b = b->next;
			}
			c->next = a;
			c = c->next;
			a = a->next;
		}else {
			c->next = b;
			c = c->next;
			b = b->next;
		}
	}
	if(a) {
		c->next = a;
	}else if(b) {
		c->next = b;
	}
	ReformPolyn(pa);
}//完成多项式相加运算,pa = pa + pb ,并销毁一元多项式 pb

void SubtractPolyn(polynomial &pa, polynomial &pb){
	polynomial a = pa->next;
	polynomial b = pb->next;
	polynomial c = pa;
	while(a && b){
		if(a->data.expn <= b->data.expn){
			if(a->data.expn == b->data.expn){
				a->data.coef -= b->data.coef;
				b = b->next;
			}
			c->next = a;
			c = c->next;
			a = a->next;
		}else {
			b->data.coef *= -1;
			c->next = b;
			c = c->next;
			b = b->next;
		}
	}
	if(a) {
		c->next = a;
	}else if(b) {
		b->data.coef *= -1;
		c->next = b;
	}
	ReformPolyn(pa);
}//完成多项式相减运算,pa = pa - pb ,并销毁一元多项式 pb

polynomial copy(polynomial p){
	polynomial t = (polynomial)malloc(sizeof(polynomial));
	t->next = NULL;
	polynomial q = t;
	p = p->next;
	while(p){
		polynomial s = (polynomial)malloc(sizeof(polynomial));
		s->data = p->data;
		s->next = t->next;
		t->next = s;
		t = t->next;
		p = p->next;
	}
	return q;
}//复制一份副本

void MultiplyPolyn(polynomial &pa, polynomial &pb){
	polynomial t = (polynomial)malloc(sizeof(polynomial));
	t->next = NULL;
	polynomial b;
	b = pb->next;
	while(b){
		polynomial p = copy(pa);
		polynomial q = p->next;
		while(q){
			q->data.coef *= b->data.coef;
			q->data.expn += b->data.expn;
			q = q->next;
		}
		AddPolyn(t,p);
		b = b->next;
	}
	pa->next = t->next;
}//完成多项式相乘运算,pa = pa * pb ,并销毁一元多项式 pb

void menu(){
	int i;
	polynomial p,q;
	while(1){
		polynomial t,s;
		printf("一元多项式加减乘运算\n");
		printf("== == == == == ==\n");
		printf("1.输入两个一元多项式\n");
		printf("2.一元多项式相加\n");
		printf("3.一元多项式相减\n");
		printf("4.一元多项式相乘\n");
		printf("请选择:");
		scanf("%d",&i);
		switch(i){
		case 1:
			int a,b;
			printf("请分别输入两个多项式的项数:");
			scanf("%d%d",&a,&b);
			CreatPolyn(p,a);
			CreatPolyn(q,b);
			break;
		case 2:
			t = copy(p);
			s = copy(q);
			AddPolyn(t,s);
			PrintPolyn(t);
			break;
		case 3:
			t = copy(p);
			s = copy(q);
			SubtractPolyn(t,s);
			PrintPolyn(t);
			break;
		case 4:
			t = copy(p);
			s = copy(q);
			MultiplyPolyn(t,s);
			PrintPolyn(t);
			break;
		}
	}
}

void main(){
	menu();
}

菜单截图

在这里插入图片描述

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值