要求如下:
1.输入并建立多项式;
2.能按照类数学表达式的形式输出结果,如,多项式-3x⁴+1输出形式为-3x^4+1序列按指数降序排列。
3.多项式a和b相加
4.多项式a和b相减
本人新手,求一个简单的一元稀疏多项式计算器,只要求加减就行,求大佬帮忙,急!?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- qq_43166840 2018-09-23 14:43关注
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<malloc.h> #define maxlen 10 #define large 999 typedef struct Linklistomial{ float coef; int expn; struct Linklistomial *next; }Linklistomial,*Linklist; void Insert(Linklist p,Linklist h){ if(p->coef==0) free(p);//系数为0的话释放结点 else { Linklist q1,q2; q1=h; q2=h->next; while(q2&&p->expn<q2->expn) { //查找插入位置 q1=q2; q2=q2->next; } if(q2&&p->expn==q2->expn) { //将指数相同相合并 q2->coef+=p->coef; free(p); if(!q2->coef) {//系数为0的话释放结点 q1->next=q2->next; free(q2); } } else { //指数为新时将结点插入 p->next=q2; q1->next=p; } } } Linklist CreateLinklist(Linklist head,int m){ //建立一个头指针为head、项数为m的一元多项式 int i; Linklist p; p=head=(Linklist)malloc(sizeof(struct Linklistomial)); head->next=NULL; for(i=0;i<m;i++) { p=(Linklist)malloc(sizeof(struct Linklistomial));//建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1); scanf("%f %d",&p->coef,&p->expn); Insert(p,head); //调用Insert函数插入结点 } return head; } void DestroyLinklist(Linklist p){ //销毁多项式p Linklist q1,q2; q1=p->next; q2=q1->next; while(q1->next) { free(q1); q1=q2; q2=q2->next; } } void PrintLinklist(Linklist P){ Linklist q=P->next; int flag=1; //项数计数器 if(!q) { //若多项式为空,输出0 putchar('0'); printf("\n"); return; } while(q) { if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项 if(q->coef!=1&&q->coef!=-1) { //系数非1或-1的普通情况 printf("%g",q->coef); if(q->expn==1) putchar('X'); else if(q->expn) printf("X^%d",q->expn); } else { if(q->coef==1) { if(!q->expn) putchar('1'); else if(q->expn==1) putchar('X'); else printf("X^%d",q->expn); } if(q->coef==-1) { if(!q->expn) printf("-1"); else if(q->expn==1) printf("-X"); else printf("-X^%d",q->expn); } } q=q->next; flag++; } printf("\n"); } int compare(Linklist a,Linklist b){ if(a&&b) { if(!b||a->expn>b->expn) return 1; else if(!a||a->expn<b->expn) return -1; else return 0; } else if(!a&&b) return -1;//a多项式已空,但b多项式非空 else return 1;//b多项式已空,但a多项式非空 } Linklist AddLinklist(Linklist pa,Linklist pb){//求解并建立多项式a+b,返回其头指针 Linklist qa=pa->next; Linklist qb=pb->next; Linklist headc,hc,qc; hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb) { qc=(Linklist)malloc(sizeof(struct Linklistomial)); switch(compare(qa,qb)){ case 1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case 0: { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } } if(qc->coef!=0) { qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//当相加系数为0时,释放该结点 } return headc; } Linklist SubLinklist(Linklist pa,Linklist pb){//求解并建立多项式a-b,返回其头指针 Linklist qa=pa->next; Linklist qb=pb->next; Linklist headc,hc,qc; hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb) { qc=(Linklist)malloc(sizeof(struct Linklistomial)); switch(compare(qa,qb)){ case 1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case 0: { qc->coef=qa->coef-qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } } if(qc->coef!=0) { qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//当相减系数为0时,释放该结点 } return headc; } int main() { int m,n,a=1; float x; char flag; Linklist pa=0,pb=0,pc; printf("请输入a的项数:"); scanf("%d",&m); pa=CreateLinklist(pa,m);//建立多项式a printf("请输入b的项数:"); scanf("%d",&n); pb=CreateLinklist(pb,n);//建立多项式 //输出菜单 printf(" *******************************************************\n"); printf(" * *\n"); printf(" * a:输出多项式a b:输出多项式b *\n"); printf(" * *\n"); printf(" * c: 输出a+b d:输出a-b *\n"); printf(" * *\n"); printf(" *******************************************************\n"); while(a) { printf("\n请选择操作:"); scanf(" %c",&flag);//空格符号一定要注意 switch(flag) { case'a': { printf("\n 多项式a="); PrintLinklist(pa); break; } case'b': { printf("\n 多项式b="); PrintLinklist(pb); break; } case'c': { pc=AddLinklist(pa,pb); printf("\n a+b="); PrintLinklist(pc); break; } case'd': { pc=SubLinklist(pa,pb); printf("\n a-b="); PrintLinklist(pc); break; } default: printf("\n 您的选择错误,请重新选择!\n"); } } }
运行效果图如下:
解决 2无用
悬赏问题
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
- ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
- ¥15 perl MISA分析p3_in脚本出错
- ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
- ¥15 ubuntu虚拟机打包apk错误
- ¥199 rust编程架构设计的方案 有偿
- ¥15 回答4f系统的像差计算