一元稀疏多项式实验报告罗忠霖Word格式文档下载.docx
《一元稀疏多项式实验报告罗忠霖Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式实验报告罗忠霖Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
![一元稀疏多项式实验报告罗忠霖Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/2/faeb462d-c9bd-4833-8546-d615551b4b60/faeb462d-c9bd-4833-8546-d615551b4b601.gif)
(1)输入并建立多项式;
(2)输出多项式,输出的形式为整数序列:
n,c1,e1,c2,,en,期中n为多项式的项数,ci和ei分别为第i
项的系数和指数,系列按指数的降序排列;
(3)多项式a和多项式b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b;
3.程序代码
#include<
stdio.h>
stdlib.h>
malloc.h>
typedefstructlist
{
floatxishu;
//某项的系数
intzhishu;
//某项的指数
structlist*next;
}*linklist;
voidcaidan(void);
voidxianshi(linklist);
linklistdx_built(int);
linklistdx_jia(linklist,linklist);
linklistdx_jian(linklist,linklist);
linklistsort(linklisthead);
main()
inti,a,b;
linklistpa,pb,pc1,pc2;
caidan();
do
{
printf("
\n"
);
请选择你想要的功能0--4\n"
scanf("
%d"
&
i);
switch(i)
{
case1:
printf("
请输入多项式A的项数:
a);
pa=dx_built(a);
pa=sort(pa);
请输入多项式B的项数:
b);
pb=dx_built(b);
pb=sort(pb);
break;
case2:
多项式A与B的和为:
"
pc1=dx_jia(pa,pb);
xianshi(pc1);
case3:
多项式A与B的差为:
pc2=dx_jian(pa,pb);
xianshi(pc2);
case4:
多项式A="
xianshi(pa);
printf("
多项式B="
xianshi(pb);
case0:
break;
}
}while(i!
=0);
你选择了退出操作,欢迎使用!
system("
pause"
//系统暂停,按任意键键继续
flushall();
cls"
}
voidcaidan(void)
{
//定义菜单函数
*************************************************\n"
\t一元稀疏多项式计算器\t\n"
0.退出程序\n"
1.建立多项式\n"
2.多项式加法\n"
3.多项式减法\n"
4.多项式输出\n"
}//caidan
linklistdx_built(intm)
//创建多项式
inti;
linklisthead,p;
head=(structlist*)malloc(sizeof(structlist));
head->
next=NULL;
for(i=1;
i<
=m;
i++)
p=(structlist*)malloc(sizeof(structlist));
(dx,%d)="
i);
scanf("
%f%d"
p->
xishu,&
zhishu);
if(p->
xishu==0)//系数为0的时候,删掉该节点
free(p);
else//系数不为0的时候
{
p->
next=head->
next;
next=p;
}
returnhead;
linklistsort(linklisthead)
//指数按降序排列
linklistp,q,tail,s;
tail=NULL;
while(head->
next!
=tail)
{
p=head;
q=p->
next;
while(q->
next->
zhishu<
q->
zhishu)
{
s=q->
p->
next=q->
q->
next=q;
q=s;
}
p=p->
q=q->
tail=q;
}
voidxianshi(linklisthead)
linklistq=head->
intflag=0;
//项数计数器
if(!
q)
{//若多项式为空,输出0
0\n"
return;
}
while(q)
if(q->
xishu>
0&
&
flag!
=0)putchar('
+'
//系数大于0且不是第一项
if(q->
xishu!
=1&
=-1)
{//系数非1或-1的普通情况
%.f"
q->
xishu);
zhishu==1)putchar('
X'
elseif(q->
zhishu)printf("
X^%d"
else
xishu==1)
zhishu)putchar('
1'
elseprintf("
xishu==-1)
-1"
zhishu==1)printf("
-X"
-X^%d"
q=q->
flag++;
linklistdx_jia(linklistpa,linklistpb)
/*多项式相加*/
linklistp=pa->
next,q=pb->
next,pc,tail,s;
//pc用来存储两个多项式的和
pc=tail=(structlist*)malloc(sizeof(structlist));
while(p!
=NULL&
q!
=NULL)
s=(structlist*)malloc(sizeof(structlist));
if(p->
zhishu>
zhishu)//p指数大,则存入pc,p然后后移
{
s->
xishu=p->
xishu;
s->
zhishu=p->
zhishu;
tail->
next=s;
tail=s;
p=p->
{if(p->
zhishu<
zhishu)//q指数大,则存入pc,q然后后移
{
s->
xishu=q->
zhishu=q->
tail->
tail=s;
q=q->
else//指数相等时
{if(p->
xishu+q->
xishu==0)//系数和为0则不存入pc中,p.q都后移
{
p=p->
q=q->
}
else//系数和不为0,则存入pc中,q,p后移
s->
xishu+q->
xishu;
tail->
next=s;
tail=s;
p=p->
q=q->
if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pc
tail->
else//q多项式比p短的时候,把p剩余的部分接到pc
next=p;
returnpc;
linklistdx_jian(linklistpa,linklistpb)
/*多项式相减*/
//pc用来存储两个多项式的差
zhishu)//q指数大,则把q是系数前加-1再存入pc,q然后后移
xishu=-(q->
xishu-q->
xishu==0)//系数差为0则不存入pc中,p.q都后移
else//系数差不为0,则存入pc中,q,p后移
xishu-q->
if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pc
三.实验使用环境(本实验所使用的平台和相关的软件)
MicrosoftVisualC++6.0
四.实验步骤和调试过程(实验步骤测试数据设计测试结果分析)
测试结果:
五.实验小结(实验过程中遇到的问题及解决过程.实验体会和收获)
1.在编写一元稀疏多项式程序代码的时候,为了实现这个程序,我采取了模块化设
计,针对每个功能,我使用一个函数去实现它;
2.在建立多项式的时候,我使用了单向链表去实现,在建立的时候,我把系数为0时候,这个节点给删掉,if(p->
然而我我这个函数还有个不足的地方,就是当指数相同,系数不同的时候,我没考虑到把它合并,这我以后会改进;
2.在主函数里,我采用了调用函数的方式,使界面简洁,但是我刚开始的时候没有准确地调用函数,程序运行失败,并且我把排序函数插入到现实函数里,导致了一个未知的错误,程序失败了,后来我把排序函数加到了建立的地方,printf("
3,这个程序我花了最多时间的地方就是加法算法,我使用了三条链,pa.pb,pc,我把和的结果给存放在pc中,当和为0的时候我不存入pc,if(p->
并且我还考虑了当两个多项式项数不相等的时候,用了一下这条语句去实现if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pc
,但是我刚开始的时候,if(p->
next==NULL),这个加法没有成功,最后发现了这个错误,运行成功;
4.我在编写这个程序的时候,很好地复习了c语言的知识,并且能够对链表这个章节的知识有很好的巩固;