一元多项式的加法乘法运算的实现.docx
- 文档编号:7096460
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:18
- 大小:249.64KB
一元多项式的加法乘法运算的实现.docx
《一元多项式的加法乘法运算的实现.docx》由会员分享,可在线阅读,更多相关《一元多项式的加法乘法运算的实现.docx(18页珍藏版)》请在冰豆网上搜索。
一元多项式的加法乘法运算的实现
数据结构课题设计报告
设计题目:
一元多项式的加、乘法的实现
姓名:
班级:
学号:
指导老师:
一、实验题目
一元多项式加法、乘法运算的实现
二、设计内容
该程序的功能是实现一个一元多项式运算。
能够完成两个多项式的相加、相乘的运算并且输出正确的答案。
三、设计实现
一元多项式加法,乘法运算的实现
1.根据输入创建一元多项式,采用顺序和链表存储结构实现
顺序存储结构:
在计算机内部可以采用不同方式存储一个线性表,其中最简单的方式就是用一组地址连续的存储单元来依次存储线性表中的数据元素。
对一元多项式存储结构的选择,输入多项式采用头插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;一元多项式可以用顺序和链表两种存储结构表示,顺序结构的最大长度很难确定。
单链表的结构体可以用来存储多项式的系数,指数,便于实现任意多项式的运算。
2.创建的的第个一元多项式用于实现加法的运算,第二个一元多项式用于实现乘法的运算。
3.运算完毕后,退出运行程序
四、概要设计
1,按要求输入一元多项式的系数
2,计算一元多项式的加法
3,输出计算结果
4,按要求输入一元多项式的系数
5,计算一元多项式的乘法
6,输出计算结果
7,退出
五、程序流程图
1,加法运算
2,乘法运算
六、源程序
#include
#include
#include
#defineNULL0
typedefstructNode{//定义结构体类型
floatcoef;//系数
intexpn;//指数
structNode*next;//结构体指针
}Node,*Linklist;
structpolynode
{
intc;
inte;
structpolynode*next;
};
structpolynode*creat(void)
{
intc,e;
structpolynode*head=NULL;
structpolynode*p1,*p2,*l,*r;
while(scanf("%d,%d%*c",&c,&e),c||e)
{
p2=(structpolynode*)malloc(sizeof(structpolynode));
p2->c=c;
p2->e=e;
p2->next=NULL;
if(head==NULL)
{head=p2;continue;}
for(l=r=head;l!
=NULL&&(l->e)
if(l==head&&l->e>e)head=p2;
elser->next=p2;
p2->next=l;
}
returnhead;
}
voidoutput(structpolynode*head)
{
structpolynode*p1;
p1=head;
if(p1==NULL)
{printf("\nmultinomialiszero\n");return;}
printf("\n");
while(p1!
=NULL)
{
printf(p1!
=head&&(p1->c)>0?
"+%d":
"%d",p1->c);
printf(p1->e?
"x^%d":
"",p1->e);
p1=p1->next;
}
printf("\n");
}
structpolynode*add(structpolynode*head1,structpolynode*head2)
{
structpolynode*p1,*p2,*r,*l,*h;
h=r=p1=head1;
p2=head2;
if(head1==NULL)
{h=head2;returnh;}
while(p1!
=NULL&&p2!
=NULL)
{
if(p1->e==p2->e)
{
p1->c+=p2->c;
p2=p2->next;
r=p1;
p1=p1->next;
continue;
}
if(p1->e
{
r=p1;
p1=p1->next;
continue;
}
if(p1->e>p2->e)
{
l=p2;
p2=p2->next;
if(p1==h)h=l;
elser->next=l;
l->next=p1;
r=l;
continue;
}
}
if(p1==NULL)r->next=p2;
returnh;
}
structpolynode*mul(structpolynode*head1,structpolynode*head2)
{
structpolynode*p,*p1,*p2,*r,*t,*head;
head=NULL;
if(head1==NULL||head2==NULL)returnhead;
for(p2=head2;p2!
=NULL;p2=p2->next)
{
for(p1=head1;p1!
=NULL;p1=p1->next)
{
p=(structpolynode*)malloc(sizeof(structpolynode));
p->c=p1->c*p2->c;
p->e=p1->e+p2->e;
p->next=NULL;
if(p1==head1)t=p;
elser->next=p;
r=p;
}
head=add(head,t);
}
//output(head);
returnhead;
}
Linklistcreatpolyn(LinklistL,intn){//构造新的一元多项式
inti;
Linklisthead,p;
head=(Linklist)malloc(sizeof(Node));//创建头结点
head->next=NULL;
L=head;
for(i=n;i>0;i--){
p=(Linklist)malloc(sizeof(Node));
printf("请输入一元多项式的第%d项的系数和指数:
",i);
scanf("%f%d",&(*p).coef,&(*p).expn);//输入系数和指数
p->next=L->next;
L->next=p;
}
return(head);//返回头结点
}//creatpolyn
intcmp(inta,intb){//比较a,b的大小
if(a>b)
return
(1);
else
if(a==b)
return(0);
else
return(-1);
}
voidprint(LinklistL){//显示一元多项式
Linklistp;
p=L->next;
while(p->next!
=NULL){
printf("%f*x^%d+",(*p).coef,(*p).expn);//输出多项式的项
p=p->next;
}
printf("%f*x^%d\n",(*p).coef,(*p).expn);//输出多项式最后一项
LinklistAddpolyn(Linklistpa,Linklistpb){//多项式相加
inta,b;
floatsum;
Linklistha,hb,qa,qb,p1,p2;
ha=pa;//ha,hb分别指向pa和pb中当前结点
hb=pb;
qa=ha->next;//qa和qb分别指向pa和pb中当前结点
qb=hb->next;
while(qa!
=NULL&&qb!
=NULL){//qa和qb均非空
a=(*qa).expn;
b=(*qb).expn;
switch(cmp(a,b)){//比较指数
case-1:
{//a
ha->next=qa;
ha=ha->next;
qa=qa->next;break;}
case0:
{//a=b
sum=(*qa).coef+(*qb).coef;
if(sum!
=0.0){
(*qa).coef=sum;
ha->next=qa;
ha=ha->next;
}
else{
p1=qa;
free(p1);
}
p2=qb;
qa=qa->next;
qb=qb->next;
free(p2);
break;}
case1:
{//a>b
ha->next=qb;
ha=ha->next;
qb=qb->next;
break;}
}//switch
}//while
while(qa!
=NULL){//如果qb不为空
ha->next=qa;
ha=ha->next;
qa=qa->next;
}
while(qb!
=NULL){//如果qb不为空
ha->next=qb;
ha=ha->next;
qb=qb->next;
}
return(pa);
}//Addpolyn
voidmain()
{
intm,n,i;
chart;
Linklistpa,pb;
pa=(Linklist)malloc(sizeof(Node));
pb=(Linklist)malloc(sizeof(Node));
printf("请输入一元多项式pa的项数:
\n");//构造一元多项式pa
scanf("%d",&m);
pa=creatpolyn(pa,m);
printf("请输入一元多项式pb的项数:
\n");//构造一元多项式pb
scanf("%d",&n);
pb=creatpolyn(pb,n);
printf("多项式pa为:
");//输出pa
print(pa);
printf("多项式pb为:
");//输出pb
print(pb);
printf("多项式pa与pb的和为:
");//输出多项式pa和pb的和
print(Addpolyn(pa,pb));
structpolynode*head1=NULL,*head2=NULL,*head=NULL;
logn:
printf("请输入需要相乘的多项式个数,至少2个:
");
scanf("%d%c",&n);
printf("\n输入一个多项式的方式为:
系数,指数;例如:
3,4;5,6;7,8;as0,0;结束\n");
printf("\n请输入第1个多项式的系数和指数:
");
head1=creat();
printf("\n第1个多项式的为:
");
output(head1);
for(i=1;i { printf("\n请输入第%d个多项式的系数和指数: ",i+1); head2=creat(); printf("\n第%d个多项式为: ",i+1); output(head2); if(i==1)head=mul(head1,head2); elsehead=mul(head,head2); } printf("\n多项式相乘结果为: "); output(head); printf("\n是否继续(y/n)? "); scanf("%*c%c",&t); if(t=='y')gotologn; } 七、程序运行界面图 1,加法运行输入项数 2,输入每一项的系数及指数 3,算出加法运算结果及乘法运行输入项数 4,入乘法运算每一项的系数及指数 5,算出乘法运算的结果 八、心得体会 通过这次的课程设计,是我又温习了数组、循环结构以及嵌套以及分块模块等C语言知识。 一元多项式是一个复杂的运算程序,但是当我设计成功后,我心花怒放。 在课程设计期间,最大的收获是一心一意全心投入去做一件事。 能力很重要,但有时候合作带来的效果也很重要! 大家在一起讨论、研究,一起解决问题,也许有时候一个程序看不懂,但大家在一起讨论,一起去解决,最终还是能够解决的。 对于很多嵌套结构还不是很熟悉,以及指针的运用不是掌握的太好。 所以还是需要进一步的熟悉运用。 东华理工大学长江学院 课程设计评分表 学生姓名: 班级: 学号: 课程设计题目: 一元多项式的加法、乘法运算的实现 项目内容 满分 实评 选 题 能结合所学课程知识、有一定的能力训练。 符合选题要求 (5人一题) 10 工作量适中,难易度合理 10 能 力 水 平 能熟练应用所学知识,有一定查阅文献及运用文献资料能力 10 理论依据充分,数据准确,公式推导正确 10 能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等 10 能体现创造性思维,或有独特见解 10 成 果 质 量 总体设计正确、合理,各项技术指标符合要求。 10 说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰 10 设计说明书栏目齐全、合理,符号统一、编号齐全。 格式、绘图、表格、插图等规范准确,符合国家标准 10 有一定篇幅,字符数不少于5000 10 总分 100 指导教师评语: 指导教师签名: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 加法 乘法 运算 实现