多项式求和求积(链表)

来源:互联网 发布:瑞星数据恢复 编辑:程序博客网 时间:2024/05/18 05:18
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>typedef struct  OrderList{     float  coef;          // 系数    int     expn;           // 指数    struct  OrderList *next;} ElemType, *polynomial;int initorderlist(polynomial &L);//初始化polynomial plusorderlist(polynomial La,polynomial Lb);//多项式求和polynomial cultorderlist(polynomial La,polynomial Lb);//多项式求积int insertorderlist(polynomial L,ElemType x,int i);//插入void seeorderlist(polynomial L);//显示polynomial locateorderlist(polynomial L,char *expn,int &i);//定位void checkorderlist(polynomial L);//检查,删除合并后系数为0的项int initorderlist(polynomial &L){L=new ElemType ;if(L==NULL){printf("空间分配失败!\n");exit(0);}L->expn=-1;L->next=NULL;return 1;}polynomial locateorderlist(polynomial L,int expn,int &i){polynomial p=L->next; i=1;while(p){ if(expn<p->expn)break;else {p=p->next;i++;}}return p;}int insertorderlist(polynomial L,int expn,float coef,int i){polynomial p=L,newp; int j=0;while(p && j<i-1){        p=p->next; j++;}        newp=new ElemType;newp->expn=expn;newp->coef=coef;        newp->next=p->next;p->next=newp;return 1;}polynomial plusorderlist(polynomial La,polynomial Lb){polynomial p1=La->next,p2=Lb->next;polynomial q,L,p; int i;if(initorderlist(L)){q=L;while(p1&&p2){if((p=new  ElemType)==NULL){printf("空间分配失败!\n");getch();exit(0);}if(p1->expn==p2->expn){p->coef=p1->coef+p2->coef;p->expn=p1->expn;p1=p1->next;p2=p2->next;}else if(p1->expn<p2->expn){p->coef=p1->coef;p->expn=p1->expn;  p1=p1->next;}else if(p1->expn>p2->expn){p->coef=p2->coef;p->expn=p2->expn;  p2=p2->next;}p->next=NULL;q->next=p;q=p;}while(p2){locateorderlist(L,p2->expn,i);insertorderlist(L,p2->expn,p2->coef,i);p2=p2->next;}while(p1){locateorderlist(L,p1->expn,i);insertorderlist(L,p1->expn,p1->coef,i);p1=p1->next;}}return L;}polynomial cultorderlist(polynomial La,polynomial Lb){polynomial p1=La->next,p2=Lb->next;polynomial q,L,p,Ld;int i;initorderlist(L);initorderlist(Ld);q=L;while(p1){while(p2){p=new ElemType;p->coef=p1->coef*p2->coef;p->expn=p1->expn+p2->expn;locateorderlist(L,p->expn,i);insertorderlist(L,p->expn,p->coef,i);p2=p2->next;}        p1=p1->next;p2=Lb->next;}return L;}void seeorderlist(polynomial L){polynomial s=L->next;printf("%.1fx^%d",s->coef,s->expn);        s=s->next;while(s){if(s->coef!=0){if(s->expn==0)if(s->coef>0)printf("+%.1f",s->coef );elseprintf("%.1f",s->coef );else if(s->coef>0)printf("+%.1fx^%d",s->coef,s->expn );elseprintf("%.1fx^%d",s->coef ,s->expn);}s=s->next;}printf("\n");}void checkorderlist(polynomial L){polynomial p,q,s;s=L->next;while(s->next){   p=s;while(p->next){  if((p->next->expn)==s->expn||p->next->coef==0)  {q=p->next;       s->coef=(q->coef)+(s->coef);       p->next=q->next;       delete q;  }  p=p->next;}s=s->next;}}void main(){polynomial p,La,Lb,Lc,Ld,q;char a[100],b[100],c[20],choice;int i,num,t;system("cls");printf("系统输入的多项式系数与指数(指数必须为正数)都为个位数,且如+2x^2的格式输入。\n");printf("----1.求和求积------2.插入项-----0.退出----\n");while(1){if(initorderlist(La)){printf("请输入多项式A(以回车结束):\n");gets(a);for(i=0;a[i]!='\0';i=i+5){q=new  ElemType;if(a[i]=='-')q->coef=-(a[i+1]-'0');elseq->coef=a[i+1]-'0';q->expn=a[i+4]-'0';locateorderlist(La,q->expn,t);insertorderlist(La,q->expn,q->coef,t);}printf("A=");seeorderlist(La);}if(initorderlist(Lb)){printf("请输入多项式B(以回车结束):\n");gets(b);for(i=0;b[i]!='\0';i=i+5){q=new  ElemType;if(b[i]=='-')q->coef=-(b[i+1]-'0');elseq->coef=b[i+1]-'0';q->expn=b[i+4]-'0';locateorderlist(Lb,q->expn,t);insertorderlist(Lb,q->expn,q->coef,t);}printf("B=");seeorderlist(Lb);}     while(1){printf("请输入你选项:\n");scanf("%d",&num);fflush(stdin);if(num<0||num>2){  printf("重新选择!按任意键继续!");          getch();}   else break;   }switch(num){case 0:exit(0);case 1:Lc=plusorderlist(La,Lb);checkorderlist(Lc);printf("A+B=");seeorderlist(Lc);Ld=cultorderlist(La,Lb);checkorderlist(Ld);printf("A*B=");seeorderlist(Ld);break;case 2:printf("输入要插入的项:\n");    gets(c);printf("请问您要插入到a式还是b式:\n");    scanf("%c",&choice);     for(i=0;c[i]!='\0';i=i+5){p=new  ElemType;if(c[i]=='-')p->coef=-(c[i+1]-'0');elsep->coef=c[i+1]-'0';p->expn=c[i+4]-'0';}if(choice=='a'){locateorderlist(La,p->expn,i);    insertorderlist(La,p->expn,p->coef,i);checkorderlist(La);seeorderlist(La);}if(choice=='b'){locateorderlist(Lb,p->expn,i);    insertorderlist(Lb,p->expn,p->coef,i);checkorderlist(Lb);seeorderlist(Lb);}break;}}}  

0 0