数据与结构-一元二次多项式
#include<stdio.h> #include<stdlib.h> typedef struct { float coef; int expn; struct Polynomial* next; }Polynomial; //建立多项式 Polynomial *CreatePoly() { Polynomial *head,*rear,*s; int c,e; head = (Polynomial *)malloc(sizeof(Polynomial));//建立多项式的头结点 rear = head;//rear始终指向单链表的尾部,便于尾插法建表 scanf("%d,%d",&c,&e);//键入多项式的系数项和指数项 while(c!=0)//若c=0,则代表多项式键入结束 { s=(Polynomial *)malloc(sizeof(Polynomial)); s->coef=c; s->expn=e; rear->next=s; rear=s; scanf("%d,%d",&c,&e); } rear->next=NULL;//将表中最后一个节点的next置为空 return head; } //输出多项式 void PrintPolyn(Polynomial *p) { Polynomial *q; q=p->next; int flag=1; if(!q)//删除掉所有的带0元素 { putchar('0'); printf("\n"); return; } while(q)//全是数据,非0数,所以一直为真 { if(q->coef>0&&flag!=1) putchar('+'); if(q->coef!=1&&q->coef!=-1) { //打印系数 printf("%g",q->coef);//自动舍弃小数点后面的0 if(q->next==1) putchar('X'); else if(q->expn)//只要指数项非0就可以执行 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"); } //两个多项式相加 //coef--系数 //expn--指数 Polynomial *AddPolyn(Polynomial *pa,Polynomial *pb) { Polynomial *qa=pa->next; Polynomial *qb=pb->next; Polynomial *headc,*pc,*qc; pc=(Polynomial *)malloc(sizeof(Polynomial));//单链表pc用来存放pa+pb的和 pc->next=NULL; headc=pc; while(qa!=NULL&&qb!=NULL) { qc=(Polynomial *)malloc(sizeof(Polynomial)); //前一个多项式的的指数小于后一项时;可以直接进行加法运算,但是并不会合并,任然是两个同的多项式 if(qa->expn<qb->expn)//规则一 { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; } //如果两个多项式指数相等,则系数可以直接进行加法运算,将两项合并 else if(qa->expn==qb->expn)//规则2 { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; } //虽然没有if语句判断条件,但可以明显看出条件是 qa->expn > qb->expn,结果仍为两个多项式,不会合并 else//规则3 { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; } //在多项式有值的情况下,将值传给pc,带出 //但是pc又等于headc,由于是指针,就会同样改变headc的值,结果就再转换成由headc带出 if(qc->coef!=0) { qc->next=qc->next; pc->next=qc; pc=qc; } //多项式没有值,要么没输入,要么输入错误,自动释放空间,无返回值 else free(qc); } //这里指的是第一个多项式 pa 中有的多项式,但第一个多项式 pb 中没有的,不用这个循环会漏掉 while(qa !=NULL)//pa中如果有剩余,将余项插入到PC中 { qc=(Polynomial*)malloc(sizeof(Polynomial)); qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; qc->next=pc->next; pc->next=qc; pc=qc; } //这里指的是第二个多项式 pb 中有的多项式,但第一个多项式 pa 中没有的,不用这个循环会漏掉 while(qb!=NULL)//pb如果有剩余,将剩余项插入到pc中 { qc=(Polynomial*)malloc(sizeof(Polynomial)); qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; qc->next=pc->next; pc->next=qc; pc=qc; } qc->next=NULL; return headc; } //两个多项式相减 Polynomial *SubtractPolyn(Polynomial *pa,Polynomial *pb) { Polynomial *h=pb; Polynomial *p=pb->next; Polynomial *pd; while(p) { p->coef*=-1; p=p->next; } pd=AddPolyn(pa,h);//调用了两个多项式相加 for(p=h->next;p;p=p->next) p->coef*=-1; return pd; } //乘法运算 Polynomial *MulPolyn(Polynomial *pa,Polynomial *pb) { Polynomial *qa=pa->next; Polynomial *qb=pb->next; Polynomial *headc,*pc,*qc; pc=( Polynomial *)malloc(sizeof( Polynomial)); pc->next=NULL; headc=pc; while(qa!=NULL) { while(qb!=NULL) { qc=(Polynomial *)malloc(sizeof( Polynomial)); qc->coef=(qa->coef)*(qb->coef); qc->expn=(qa->expn)+(qb->expn); qb=qb->next; qc->next=pc->next; pc->next=qc;//qc的指数和系数都还在qc中,所以把qc赋值给pc的next结点,因为pc本身为空,就是用来装新的数据的 pc=qc; } qa=qa->next; if(qa!=NULL) qb=pb->next; } pc=qc;//pc同步qc,将首地址传给pc qc->next=NULL; return headc;//pc同步headc,由headc传出首地址 } int main() { Polynomial *q3; Polynomial *q4; Polynomial *q5; int num=1; printf("请输入你的选项:\n"); printf("0.退出!\n"); printf("1.建立多项式\n"); printf("2.多项式相加\n"); printf("3.多项式相减\n"); printf("4.输出多项式\n"); printf("5.多项式相乘\n"); while(num!=0) { printf("请输入你的指令:"); scanf("%d",&num); switch(num) { case 0:num=0; break; case 1: printf("系数与指数之间用逗号隔开\n"); printf("0表示结束输入\n"); printf("请输入建立的第一个多项式:"); Polynomial *q1=CreatePoly(); printf("请输入建立的第二个多项式:"); Polynomial *q2=CreatePoly(); break; case 2:q3=AddPolyn(q1,q2); printf("两个多项式相加的结果为:\n"); PrintPolyn(q3); break; case 3:q4=SubtractPolyn(q1,q2); printf("两个多项式相减的结果为:\n"); PrintPolyn(q4); break; case 4:printf("多项式1:\n"); PrintPolyn(q1); printf("多项式2:\n"); PrintPolyn(q2); break; case 5:q5=MulPolyn(q1,q2); printf("两个多项式相乘的结果为:\n"); PrintPolyn(q5); break; default:printf("指令错误!请重输:\n"); break; } } }