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();
}