数据结构实验报告《一多项式及其运用》.docx
《数据结构实验报告《一多项式及其运用》.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告《一多项式及其运用》.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实验报告《一多项式及其运用》
中南大学物理学院
数据结构实验报告----
一元多项式相加及其运用
专业班级:
电信0903
时间:
2010年10月18日
【问题描述】
设计一个一元稀疏多项式简单计算器
【基本要求】
一元稀疏多项式简单计算器的功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,………cn,en,其中n是多
项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b。
【运用拓展】
(1)计算多项式在x处的值;
(2)多项式a和b相乘,建立乘积多项式ab;
(3)计算器的仿真友好界面。
【设计思路分析】
(1)解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表。
(2)运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题
(3)设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
【测试数据】
多项式a:
6x+3x^5-7.1x^11
多项式b:
2-5x^5+11x^9
若计算a+b则有:
(6x+3x^5-7.1x^11)+(2-5x^5+11x^9)=(-7.1x^11+11x^9-2x^5+6x+2)等。
【操作界面显示】
1:
建立多项式的操作:
2:
输出多项式及计算x的值
3:
进行运算操作:
4:
结束程序:
【程序代码】
#include//调用输入输出函数
#include
typedefstructPolynomial//定义一个Polyn结构体
{floatcoef;intexp;//系数指定为浮点型,指数指定为整型
structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){//查找位置插入新链节
if(p->coef==0)free(p);//p系数为0的话释放结点
else{//否则查找插入位置
Polynq1,q2;
q1=h;q2=h->next;
while(q2&&p->expexp)//指数较大则插前面
{q1=q2;q2=q2->next;}
if(q2&&p->exp==q2->exp)//将指数相同相合并
{q2->coef+=p->coef;
free(p);
if(!
q2->coef)//系数为0的话释放结点
{
q1->next=q2->next;
free(q2);
}
else{p->next=q2;q1->next=p;}//指数为新时将结点插入
}//第一个else
}//voidInsert
PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));//开辟多项式地址空间
head->next=NULL;//指定表尾,然后采用尾插法输入多项式
for(i=0;i{p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f%d",&p->coef,&p->exp);Insert(p,head);//调用Insert函数插入结点}returnhead;}voidPrintPolyn(PolynP)//输出多项式{Polynq=P->next;intflag=1;//项数计数器if(!q){//若多项式为空,输出0putchar('0');printf("\n");return;}//voidifwhile(q){if(q->coef>0&&flag!=1)putchar('+');//系数大于0且不是第一项,显示"+"连接if(q->coef!=1&&q->coef!=-1)//系数非1或-1时输出{printf("%g",q->coef);if(q->exp==1)putchar('X');//指数为1时,直接输出"X"elseif(q->exp)printf("X^%d",q->exp);//指数不为1时,输入"X^"格式}//whileififelse{if(q->coef==1){if(!q->exp)putchar('1');elseif(q->exp==1)putchar('X');elseprintf("X^%d",q->exp);}//elseifif(q->coef==-1)//系数为"-1"时,前面加上负号,其他情况与"+1"类似{if(!q->exp)printf("-1");elseif(q->exp==1)printf("-X");elseprintf("-X^%d",q->exp);}//elseifif}//elseq=q->next;flag++;}//whileprintf("\n");}//voidintcompare(Polyna,Polynb)//两个多项式的判断{if(a&&b)//若两个多项式都非空{if(!b||a->exp>b->exp)return1;//b多项式已空或指数较小,返回1elseif(!a||a->expexp)return-1;//a多项式已空或指数较小,返回-1elsereturn0;//a、b两多项式的指数相等,返回0}//ifelseif(!a&&b)return-1;//a多项式已空,但b多项式非空elsereturn1;//b多项式已空,但a多项式非空}//comparePolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针Polynqa=pa->next;Polynqb=pb->next;Polynheadc,hc,qc;hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点hc->next=NULL;//指向结尾,采用尾插法headc=hc;while(qa||qb){qc=(Polyn)malloc(sizeof(structPolynomial));//开辟地址空间switch(compare(qa,qb))//判断多项式a和b{case1:{qc->coef=qa->coef;//输入a多项式qc->exp=qa->exp;qa=qa->next;break;}case0:{qc->coef=qa->coef+qb->coef;//指数相等时系数相加qc->exp=qa->exp;qa=qa->next;qb=qb->next;break;}case-1:{qc->coef=qb->coef;//输入b多项式qc->exp=qb->exp;qb=qb->next;break;}}//switchif(qc->coef!=0)//当相加系数不为0,加入该结点{qc->next=hc->next;hc->next=qc;hc=qc;}elsefree(qc);//当相加系数为0时,释放该结点}//whilereturnheadc;}PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a-b,返回其头指针Polynh=pb;Polynp=pb->next;Polynpd;while(p){//将pb的系数取反p->coef*=-1;p=p->next;}//whilepd=AddPolyn(pa,h);for(p=h->next;p;p=p->next)//恢复pb的系数p->coef*=-1;returnpd;}//SubtractPolynPolynMultiplyPolyn(Polynpa,Polynpb){//求解并建立多项式a*b,返回其头指针Polynhf,pf;Polynqa=pa->next;Polynqb=pb->next;hf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点hf->next=NULL;for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){pf=(Polyn)malloc(sizeof(structPolynomial));pf->coef=qa->coef*qb->coef;pf->exp=qa->exp+qb->exp;Insert(pf,hf);//调用Insert函数以合并指数相同的项}//forfor}//forreturnhf;}//MultiplyPolynfloatValuePolyn(Polynhead,intx){//输入x值,计算并返回多项式的值Polynp;inti,t;floatsum=0;for(p=head->next;p;p=p->next){t=1;for(i=p->exp;i!=0;){if(i<0){t/=x;i++;}//指数小于0,进行除法else{t*=x;i--;}//指数大于0,进行乘法}//forforsum+=p->coef*t;//计算求和}//forreturnsum;}//ValuePolynvoidDestroyPolyn(Polynp) //销毁多项式p { Polynq1,q2; q1=p->next;q2=q1->next; while(q1->next) //删除q1的元素直至q1为空 {free(q1);q1=q2;q2=q2->next;} }//DestroyPolynvoidmain(){intm,n,a,x; charflag;Polynpa=0,pb=0,pc;printf("--------------------------------------------------\n");printf("欢迎使用一元多项式及其运用操作程序\n");printf("--------------------------------------------------\n");printf("请输入多项式a的项数:");scanf("%d",&m);pa=CreatePolyn(pa,m);//建立多项式aprintf("请输入多项式b的项数:");scanf("%d",&n);pb=CreatePolyn(pb,n);//建立多项式b//输出菜单printf("*****************************************************\n");printf("*一元稀疏多项式简单计算器*\n");printf("**\n");printf("*A:输出多项式aB:输出多项式b*\n");printf("**\n");printf("*C:同时输出多项式a和b*\n");printf("**\n");printf("*D:代入x的值计算aE:代入x的值计算b*\n");printf("**\n");printf("*F:代人x的值同时计算a和b*\n");printf("**\n");printf("*G:输出a+bH:输出a-b*\n");printf("**\n");printf("*I:输出a*bJ:退出*\n");printf("**\n");printf("*****************************************************\n");while(a){printf("\n请选择操作:");//提示选择操作scanf("%c",&flag);//输入选择switch(flag)//输入大小写都可以判断{case'A':case'a':{printf("\n多项式a=");//输出多项式aPrintPolyn(pa);//调用输出函数显示break;//跳出}case'B':case'b':{printf("\n多项式b=");//输出多项式bPrintPolyn(pb);break;}case'C':case'c':{printf("\n多项式a=");//输出多项式a和bPrintPolyn(pa);printf("\n多项式b=");PrintPolyn(pb);break;}case'D':case'd':{printf("输入x的值:x=");//输入x值后计算ascanf("%d",&x);printf("\nx=%d时,a=%.3f\n",x,ValuePolyn(pa,x));break;}case'E':case'e':{printf("输入x的值:x=");//输入x值后计算bscanf("%d",&x);printf("\nx=%d时,b=%.3f\n",x,ValuePolyn(pb,x));break;}case'F':case'f':{printf("输入x的值:x=");//输入x值后计算a和bscanf("%d",&x);printf("\nx=%d时,a=%.3f\n",x,ValuePolyn(pa,x));printf("\nx=%d时,b=%.3f\n",x,ValuePolyn(pb,x));break;}case'G':case'g':{pc=AddPolyn(pa,pb);//输出a+b,用新多项式显示printf("\na+b=");PrintPolyn(pc);break;}case'H':case'h':{pc=SubtractPolyn(pa,pb);//输出a-b,用新多项式显示printf("\na-b=");PrintPolyn(pc);break;}case'I':case'i':{pc=MultiplyPolyn(pa,pb);//输出a*b,用新多项式显示printf("\na*b=");PrintPolyn(pc);break;}case'J':case'j':{printf("\n感谢使用此程序!\n");//退出该程序DestroyPolyn(pa);//删除多项式aDestroyPolyn(pb);//删除多项式ba=0;//暂停显示界面,用户选择关闭break;}default:printf("\n您的选择错误,请重新选择!\n");}//swich}//while}//main
p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->coef,&p->exp);
Insert(p,head);//调用Insert函数插入结点
returnhead;
voidPrintPolyn(PolynP)//输出多项式
{Polynq=P->next;
intflag=1;//项数计数器
q){//若多项式为空,输出0
putchar('0');
printf("\n");
return;
}//voidif
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->exp==1)putchar('X');//指数为1时,直接输出"X"
elseif(q->exp)printf("X^%d",q->exp);//指数不为1时,输入"X^"格式
}//whileifif
else{if(q->coef==1)
{if(!
q->exp)putchar('1');
elseif(q->exp==1)putchar('X');
elseprintf("X^%d",q->exp);
}//elseif
if(q->coef==-1)//系数为"-1"时,前面加上负号,其他情况与"+1"类似
q->exp)printf("-1");
elseif(q->exp==1)printf("-X");
elseprintf("-X^%d",q->exp);
}//elseifif
}//else
q=q->next;flag++;
}//while
}//void
intcompare(Polyna,Polynb)//两个多项式的判断
{if(a&&b)//若两个多项式都非空
b||a->exp>b->exp)return1;//b多项式已空或指数较小,返回1
elseif(!
a||a->expexp)return-1;//a多项式已空或指数较小,返回-1
elsereturn0;//a、b两多项式的指数相等,返回0
}//if
a&&b)return-1;//a多项式已空,但b多项式非空
elsereturn1;//b多项式已空,但a多项式非空
}//compare
PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynqa=pa->next;
Polynqb=pb->next;
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hc->next=NULL;//指向结尾,采用尾插法
headc=hc;
while(qa||qb)
{qc=(Polyn)malloc(sizeof(structPolynomial));//开辟地址空间
switch(compare(qa,qb))//判断多项式a和b
{case1:
{qc->coef=qa->coef;//输入a多项式
qc->exp=qa->exp;qa=qa->next;break;}
case0:
{qc->coef=qa->coef+qb->coef;//指数相等时系数相加
qc->exp=qa->exp;qa=qa->next;qb=qb->next;break;}
case-1:
{qc->coef=qb->coef;//输入b多项式
qc->exp=qb->exp;qb=qb->next;break;}
}//switch
if(qc->coef!
=0)//当相加系数不为0,加入该结点
{qc->next=hc->next;hc->next=qc;hc=qc;}
elsefree(qc);//当相加系数为0时,释放该结点
returnheadc;
PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a-b,返回其头指针
Polynh=pb;
Polynp=pb->next;
Polynpd;
while(p){//将pb的系数取反
p->coef*=-1;p=p->next;
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next)//恢复pb的系数
p->coef*=-1;
returnpd;
}//SubtractPolyn
PolynMultiplyPolyn(Polynpa,Polynpb){//求解并建立多项式a*b,返回其头指针
Polynhf,pf;
Polynqa=pa->next;Polynqb=pb->next;
hf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{for(qb=pb->next;qb;qb=qb->next)
{pf=(Polyn)malloc(sizeof(structPolynomial));
pf->coef=qa->coef*qb->coef;
pf->exp=qa->exp+qb->exp;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}//forfor
}//for
returnhf;
}//MultiplyPolyn
floatValuePolyn(Polynhead,intx){//输入x值,计算并返回多项式的值
Polynp;inti,t;floatsum=0;
for(p=head->next;p;p=p->next)
{t=1;for(i=p->exp;i!
=0;)
{if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
sum+=p->coef*t;//计算求和
returnsum;
}//ValuePolyn
voidDestroyPolyn(Polynp) //销毁多项式p
{ Polynq1,q2;
q1=p->next;q2=q1->next;
while(q1->next) //删除q1的元素直至q1为空
{free(q1);q1=q2;q2=q2->next;}
}//DestroyPolyn
voidmain()
{intm,n,a,x; charflag;
Polynpa=0,pb=0,pc;
printf("--------------------------------------------------\n");
printf("欢迎使用一元多项式及其运用操作程序\n");
printf("请输入多项式a的项数:
");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入多项式b的项数:
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式b
//输出菜单
printf("*****************************************************\n");
printf("*一元稀疏多项式简单计算器*\n");
printf("**\n");
printf("*A:
输出多项式aB:
输出多项式b*\n");
printf("*C:
同时输出多项式a和b*\n");
printf("*D:
代入x的值计算aE:
代入x的值计算b*\n");
printf("*F:
代人x的值同时计算a和b*\n");
printf("*G:
输出a+bH:
输出a-b*\n");
printf("*I:
输出a*bJ:
退出*\n");
while(a)
{printf("\n请选择操作:
");//提示选择操作
scanf("%c",&flag);//输入选择
switch(flag)//输入大小写都可以判断
{case'A':
case'a':
{printf("\n多项式a=");//输出多项式a
PrintPolyn(pa);//调用输出函数显示
break;//跳出
case'B':
case'b':
{printf("\n多项式b=");//输出多项式b
PrintPolyn(pb);
break;
case'C':
case'c':
{printf("\n多项式a=");//输出多项式a和b
PrintPolyn(pa);
printf("\n多项式b=");
case'D':
case'd':
{printf("输入x的值:
x=");//输入x值后计算a
scanf("%d",&x);
printf("\nx=%d时,a=%.3f\n",x,ValuePolyn(pa,x));
case'E':
case'e':
x=");//输入x值后计算b
printf("\nx=%d时,b=%.3f\n",x,ValuePolyn(pb,x));
case'F':
case'f':
x=");//输入x值后计算a和b
case'G':
case'g':
{pc=AddPolyn(pa,pb);//输出a+b,用新多项式显示
printf("\na+b=");
PrintPolyn(pc);
case'H':
case'h':
{pc=SubtractPolyn(pa,pb);//输出a-b,用新多项式显示
printf("\na-b=");
case'I':
case'i':
{pc=MultiplyPolyn(pa,pb);//输出a*b,用新多项式显示
printf("\na*b=");
case'J':
case'j':
{printf("\n感谢使用此程序!
\n");//退出该程序
DestroyPolyn(pa);//删除多项式a
DestroyPolyn(pb);//删除多项式b
a=0;//暂停显示界面,用户选择关闭
default:
printf("\n您的选择错误,请重新选择!
\n");
}//swich
}//main
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1