一元多项式的相加与相乘
实验目的:
写出一元多项式相乘的程序和一元多项式相加并调试通过。
实验要求:
1、写出一元多项式的横向输出方式,当系数为零时,要求重新输入数据。
2、把加法改写成Lc=La+Lb,方便进行 Lc=La*Lb
程序已知的BUG,在考虑健壮性的时候,要考虑到当输入系数为0的时候,要求重新输入,而我的程序,输入第一个多项式,输入系数为0错误,给出提示,重新输入,后面的代码不正常,而输入第二个多项式,一旦输入系数为0,虽然也给出提示,但是后面的结果运算不正确。本人比较懒,就没有修改,这种Bug请大家自行修改!
实验代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define null 0
typedef struct {
float coef; //系数
int expn; //指数
} term;
typedef int status;
typedef struct Lnode {
term data;
struct Lnode *next; //指针域
}*Link,*Linklist; //课本31页 两个名字是等价的
int cmp(term a,term b) { //比较函数,依a的指数值<(或=、或>)b的指数值,分别返回-1、0、和+1
if (a.expn==b.expn) return 0;
else return (a.expn-b.expn)/abs(a.expn-b.expn);
}
int comp(Link a, Link b)
//比较两结点指数大小,根据情况返回不同值
{
if (a->data.expn<b->data.expn) return -1;
else if(a->data.expn == b->data.expn) return 0;
else return 1;
}
void Orderinsert(Linklist &L,term e,int (*comp)(term,term)) { // 顺序插入
Link o,p,q;
q=L;
p=q->next;
while (p&&comp(p->data,e)<0) {
q=p;
p=p->next;
}
o=(Link)malloc(sizeof(Lnode));
o->data=e;
q->next=o;
o->next=p;
}
status LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term)) {
Link p;
s=L;
p=s->next;
while (p&&comp(p->data,e)!=0) {
s=p;
p=p->next;
}
if(!p) {
s=q=null;
return 0;
} else {
q=p;
return 1;
}
}
void Delnext(Linklist &L,Link s) {
Link q=s->next;
s->next=q->next;
free(q);
}
void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term)) {
Link q,s;
if (LocateElem(L,e,s,q,compara)) {
q->data.coef+=e.coef;
if (!q->data.coef) {
Delnext(L,s);
}
} else Orderinsert(L,e,compara);
}
void Creatpolyn (Linklist &p,int m) {
term e;
int i;
p=(Link)malloc(sizeof(Lnode));
p->next=null;
printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
do{
for(i=0; i<m; i++) {
scanf("%f%d",&e.coef,&e.expn);
if(0.0 == e.coef) {
printf("系数不能为0\n请重新输入: ");
scanf("%f%d",&e.coef,&e.expn);
} else Orderinsertmerge(p,e,cmp);
}
}while(0.0==e.coef);
}
/*void add(Linklist &La,Linklist Lb) { //请把这个函数修改成void add(Linklist La,Linklist Lb,Linklist &Lc)实现Lc=La+Lb
Link qb;
term b;
qb=Lb->next;
while(qb) {
b=qb->data;
Orderinsertmerge(La,b,cmp);
qb=qb->next;
}
}*/
void add3(Linklist &La,Linklist &Lb,Linklist &Lc)//pa,pb均指向头结点
//两个多项式相加得一个新多项式,并且返回新多项式的头结点的指针
{
Link p, q, s, pc;
float sum;
term a;
term b;
p = La->next;
q = Lb->next;
Lc=(Link)malloc(sizeof(Lnode)); //新多项式的头结点
pc = Lc; //pc指向新多项式的头结点
while(p&&q) {
switch(comp(p, q)) {
case -1:// //若指数:p<q,则将p所指结点链入头结点为Lc的链表中,且p向后遍历
s = (Link)malloc(sizeof(Lnode));
s->data.coef = p->data.coef;
s->data.expn = p->data.expn;
pc->next = s;
pc = s;
p = p->next;
break;
case 0://若比较两项的指数相等,则将两项系数相加后得到的项放入头结点为Lc的链表中 ,且p,q同时向后遍历
sum = p->data.coef+q->data.coef;
if(sum!=0.0) { //若两项系数相加为0,则不放入头结点为Lc的链表中
s = (Link)malloc(sizeof(Lnode));
s->data.coef = sum;
s->data.expn = p->data.expn;
pc->next = s;
pc = s;
}
p = p->next;
q = q->next;
break;
case 1://若指数:q<p,则将q所指结点链入头结点为Lc的链表中,且q向后遍历
s = (Link)malloc(sizeof(Lnode));
s->data.coef = q->data.coef;
s->data.expn = q->data.expn;
pc->next = s;
pc = s;
q = q->next;
break;
}
}
pc->next=p?p:q;//链入pa或pb的剩余项
}
//此处请添加一个一元多项式乘法函数
void mul(Linklist &La,Linklist &Lb,Linklist &Lc) {
Link qa,qb,qc;
term e;
qa=La->next;
qc=Lc;
while(qa) {
qb=Lb->next;
while(qb) {
e.coef = qa->data.coef * qb->data.coef;
e.expn = qa->data.expn + qb->data.expn;
if(e.coef != 0.0) Orderinsertmerge(qc,e,cmp);
qb=qb->next;
}
qa=qa->next;
}
}
void printpolyn(Linklist p) {
Link q;
q=p->next;
printf(" 系数 指数\n");
while(q) {
printf("%8.2f %-d\n",q->data.coef,q->data.expn);
q=q->next;
}
}
//此处请添加一个横向输出一元多项式的程序PrintList(),考虑情况要全面
void PrintList(Linklist p) {
Link q;
q=p->next;
printf("P(x) = ");
if(q==null) {
printf("0\n");
return ;
}
printf("%.2f*X^%d ",q->data.coef,q->data.expn);
q=q->next;
while(q) {
if(q->data.coef>0)
printf("+ %.2f*X^%d ",q->data.coef,q->data.expn);
else if(q->data.coef<0)
printf("- %.2f*X^%d ",-q->data.coef,q->data.expn);
q=q->next;
}
printf("\n");
}
int main() {
int x;
Linklist L1,L2,L3;
printf("\n请输入第一个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L1,x);
printpolyn(L1);
printf("\nL1=");
PrintList(L1);
printf("\n请输入第二个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L2,x);
printpolyn(L2);
printf("\nL2=");
PrintList(L2);
/*add(L1,L2);
printf("\n相加以后的一元多项式为:\n");
printpolyn(L1);
printf("\nL1+L2=");
PrintList(L1);*/
printf("请输入要选择的运算(+ , *): ");
char ch1;
getchar(); //清除掉缓冲区的回车符
scanf("%c",&ch1);
getchar(); //清除掉缓冲区的回车符
switch(ch1) {
case '+': {
Creatpolyn(L3,0);
add3(L1,L2,L3);
printf("\n相加以后的一元多项式为:\n");
printpolyn(L3);
PrintList(L3);
}
break;
case '*': {
Creatpolyn(L3,0);
mul(L1,L2,L3);
printf("\n相乘以后的一元多项式为:\n");
printpolyn(L3);
PrintList(L3);
}
break;
default:
printf("您输入了错误指令 %c !",ch1);
}
}
程序正确运行结果如下:
这种Bug没有精力改动了,毕竟光写这个代码,我都快猝死了,不介意给个赞吧,谢谢!