【数据结构】一元稀疏多项式计算器

====更新于2020年11月20日20点36分 =====

  • 修复了乘法符号相反的bug
  • 优化输出格式,使输出跟数学表达式一致

基本功能

  1. 一元多项式的加减
  2. 一元多项式的乘法
  3. 一元多项式的导数
  4. 一元多项式的输出为数学表达式

运行截图:

在这里插入图片描述

源代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct{
    float coef;//系数
    int expn;//指数
} Term;
typedef struct ploynomial{
    Term term; //数据域 
    ploynomial* next; //指针域 
} ploynomial,*LinkList;
// 初始化链表 
void InitList(LinkList &L){
    L= (ploynomial*)malloc(sizeof(ploynomial));//头结点
    // 头结点不参与运算和输出,仅用来指向多项式的第一个结点 
    L->term.coef=0.0;
    L->term.expn=-1;
    L->next=NULL;
}
 //比较结点的系数大小 
int cmp(Term a,Term b){
    if(a.expn>b.expn) return -1;
    else if(a.expn==b.expn) return 0;
    else return 1;
}
// 插入函数 
// 这里用到了插入排序的思想 
//将结点插入多项式链表的适当位置
void insertNode(LinkList &L,Term e){
    ploynomial* q=L;
    //从头结点的下一个结点开始往后遍历,找到第一个指数小于等于当前结点指数的结点 
    while(q->next!=NULL&&cmp(q->next->term,e)<0){
        q=q->next; 
    }
    //指数相同,系数相加,不用新建结点 
    if(q->next!=NULL&&cmp(q->next->term,e)==0) {
        q->next->term.coef+=e.coef;
    }
    //新建结点插入 
    else{
        ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));
        node->term.coef=e.coef;
        node->term.expn=e.expn;
        node->next = q->next;
		q->next =node; 
    }
}
void CreatPolyn(LinkList &L,int m){
    //输入m项的系数和指数,建立表示一元多项式的有序链表L
    Term e;
    InitList(L);
    for(int i=1; i<=m; i++){
        printf("\n第%d项的系数和指数:",i);
        scanf("%f%d",&e.coef,&e.expn);
        insertNode(L,e);
    }
}
//用L返回L1+L2的结果
//相加操操作 用 插入函数实现 
void addPolyn(LinkList &L,LinkList L1,LinkList L2){
	ploynomial* q;
    for(q=L1->next; q!=NULL; q=q->next){
        insertNode(L,q->term);//将L1的每一项插入到L中
    }
    for(q=L2->next; q!=NULL; q=q->next) {
        insertNode(L,q->term);//将L2的每一项插入到L中
    }
}
//用L返回L1-L2的结果
//相减操作同样用 插入函数实现 
void SubtracatPolyn(LinkList &L,LinkList L1,LinkList L2){
	ploynomial* q;
    for(q=L1->next; q!=NULL; q=q->next){
        insertNode(L,q->term);//将L1的每一项插入到L中
    }
    for(q=L2->next; q!=NULL; q=q->next){
        q->term.coef = -(q->term.coef); //把系数变成相反数,再进行相加操作,即为L1-L2
        insertNode(L,q->term);//将L2的每一项插入到L中
        q->term.coef = -q->term.coef; //系数恢复 
    }
}
//用L返回L1*L2的结果
void multiplyPolyn(LinkList &L,LinkList L1,LinkList L2){
    ploynomial *p,*q;
    Term term;
    term.coef=0.0;
    term.expn=0;
    for(q=L1->next; q!=NULL; q=q->next){
        for(p=L2->next; p!=NULL; p=p->next){
            term.coef=(q->term.coef)*(p->term.coef);//系数相乘
            term.expn=(q->term.expn)+(p->term.expn);// 指数相加
            insertNode(L,term);
        }
    }
}
//用L返回L1的导数
void derivativePolyn(LinkList &L,LinkList L1){
    ploynomial *p;
    Term term;
    for(p=L1->next; p!=NULL; p=p->next){
        if(p->term.expn==0){
            continue;//指数为0时,跳过此次循环
        } 
        term.coef=(p->term.coef)*(p->term.expn); //系数乘以指数
        term.expn=(p->term.expn)-1;//指数减一
        insertNode(L,term);
    }
}
//以类数学表达式的形式打印输出一元多项式L
//即指数或者系数为1的情况下 省略1
void visitList(LinkList L){
    ploynomial* q=L->next;
	int first =1;
	int allZero = 1; 
	while(q!=NULL){
		if(q->term.coef==0) {
			q=q->next; continue; //系数为0,跳过 
		}
		allZero = 0;
		if(first!=1&&q->term.coef>0) printf("+"); 
		if(q->term.expn ==0||q->term.coef!=1&&q->term.coef!=-1) printf("%g",q->term.coef);
		if(q->term.coef==-1&&q->term.expn !=0) printf("-");
		if(q->term.expn!=0)printf("X");
		if(q->term.expn!=1&&q->term.expn!=0) printf("^%d",q->term.expn);
		first =0;
		q=q->next;
	}
	if(allZero) printf("0");
    printf("\n");
}
int main()
{
    LinkList L1,L2;
    int n1,n2;
    printf("请输入多项式L1的项数:");
    scanf("%d",&n1);
    CreatPolyn(L1,n1);
    printf("请输入多项式L2的项数:");
    scanf("%d",&n2);
    CreatPolyn(L2,n2);
    printf("\n多项式L1:  ");
    visitList(L1);
    printf("\n多项式L2:  ");
    visitList(L2);
    LinkList add,sub,multiply,derivative1,derivative2;
    InitList(add);
    InitList(sub);
    InitList(multiply);
    InitList(derivative1);
    InitList(derivative2);
    derivativePolyn(derivative1,L1);
    derivativePolyn(derivative2,L2);
    printf("\nL1的导数: ");
    visitList(derivative1);
    printf("\nL2的导数: ");
    visitList(derivative2);
    addPolyn(add,L1,L2);
    SubtracatPolyn(sub,L1,L2);
    multiplyPolyn(multiply,L1,L2);
    printf("\nL1 + L2:   ");
    visitList(add);
    printf("\nL1 - L2:   ");
    visitList(sub);
    printf("\nL1 * L2:   ");
    visitList(multiply);
}
  • 23
    点赞
  • 239
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值