数据结构实验报告《一多项式及其运用》.docx
- 文档编号:7156429
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:12
- 大小:257.66KB
数据结构实验报告《一多项式及其运用》.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->expn
②若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->exp
{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){//若多项式为空,输出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"类似 {if(! q->exp)printf("-1"); elseif(q->exp==1)printf("-X"); elseprintf("-X^%d",q->exp); }//elseifif }//else q=q->next;flag++; }//while printf("\n"); }//void intcompare(Polyna,Polynb)//两个多项式的判断 {if(a&&b)//若两个多项式都非空 {if(! b||a->exp>b->exp)return1;//b多项式已空或指数较小,返回1 elseif(! a||a->exp elsereturn0;//a、b两多项式的指数相等,返回0 }//if elseif(! 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时,释放该结点 }//while returnheadc; } PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a-b,返回其头指针 Polynh=pb; Polynp=pb->next; Polynpd; while(p){//将pb的系数取反 p->coef*=-1;p=p->next; }//while 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,进行乘法 }//forfor sum+=p->coef*t;//计算求和 }//for 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("--------------------------------------------------\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("**\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=");//输出多项式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="); PrintPolyn(pb); break; } case'D': case'd': {printf("输入x的值: x=");//输入x值后计算a scanf("%d",&x); printf("\nx=%d时,a=%.3f\n",x,ValuePolyn(pa,x)); break; } case'E': case'e': {printf("输入x的值: x=");//输入x值后计算b scanf("%d",&x); printf("\nx=%d时,b=%.3f\n",x,ValuePolyn(pb,x)); break; } case'F': case'f': {printf("输入x的值: x=");//输入x值后计算a和b scanf("%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);//删除多项式a DestroyPolyn(pb);//删除多项式b a=0;//暂停显示界面,用户选择关闭 break; } default: printf("\n您的选择错误,请重新选择! \n"); }//swich }//while }//main
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一多项式及其运用 数据结构 实验 报告 多项式 及其 运用