c语言稀疏多项式的加法,请问哪个大哥可以帮我解决一下这个问题一元稀疏多项式的加减法简...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

请问哪个大哥可以帮我解决一下这个问题

一元稀疏多项式的加减法简单计算器,有个地方怎么也弄不出来

#include#include#include#define TURE 1#define FALSE 0 #define OK 1#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct LNode{float coef;//系数ElemType expn;//指数struct LNode *next; }LNode,*LinkList;//将节点P插入到多项链表h//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->expnexpn){//查找插入位置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 LNode));head->next=NULL;for(i=0;icoef,&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; } } //输出构造的一元多项数P 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"); } //节点进行比较 //a的指数>b的指数 return 1 //a的指数==b的指数 return 0 //a的指数expn>b->expn)return 1; else if(!a||a->expnexpn)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 LNode)); //建立头节点 hc->next=NULL; headc=hc; while(qa||qb){ qc=(LinkList)malloc(sizeof(struct LNode)); 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 SubtractLinkList(LinkList pa,LinkList pb){//求解并建立多项式a-b,返回其头指针LinkList h=pb;LinkList p=pb->next;LinkList pd;while(p){//将pb的系数取反p->coef*=-1;p=p->next;} pd=AddLinkList(pa,h);for(p=h->next;p;p=p->next)//恢复pb的系数p->coef*=-1;return pd; } void main() { int m,n,a,x; char flag; LinkList pa=0,pb=0,pc=0; printf("请输入a的项数:");scanf("%d",&m);pa=CreateLinkList(pa,m);//建立多项式aprintf("请输入b的项数:");scanf("%d",&n);pa=CreateLinkList(pb,n);//建立多项式b//输出菜单printf(" *************************** \n ");printf(" * A:输出多项式a *\n "); printf(" * B:输出多项式b *\n "); printf(" * C:输出多项式a+b *\n "); printf(" * D:输出多项式a-b *\n ");printf(" * E:强制退出程序 *\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': {printf("pc=SubtractLinkList(pa,pb)"); printf("\n a-b="); PrintLinkList(pc); break; } case 'E': {printf("感谢使用程序!\n"); DestroyLinkList(pa); DestroyLinkList(pb); exit(0);}//强制程序退出 default:printf("\n 您的选择错误,请重新选择!\n "); }} }

fa99897ab07f1e94f3f4196406abea0a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值