一元稀疏多项式简单计数器实验报告Word格式.docx
- 文档编号:16289758
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:16
- 大小:49.14KB
一元稀疏多项式简单计数器实验报告Word格式.docx
《一元稀疏多项式简单计数器实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式简单计数器实验报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
p,m)
操作结果:
输入m项的系数和指数,建立一元多项式p。
DestoryLinkList(&
p)
初始条件:
一元多项式p已存在。
销毁一元多项式p.
PrintLinkList(p)
打印输出一元多项式p.
AddLinkList(&
pa,&
pb)
一元多项式pa和pb已存在。
完成多项式的相加运算,即:
pa=pa+pb,并销毁一元多项式pb.
SubtractLinkList(&
完成多项式的想减运算,即:
pa=pa-pb,并销毁一元多项式pb.
MultiLinkList(&
完成多项式相乘运算,即:
pa=pa*pb,并销毁一元多项式pb.
}ADTLinkList
2.2本程序包括个模块:
1)主程序模块:
Voidmain(){
初始化;
输出菜单;
While
(1){
接受命令;
处理命令;
}(循环一直为真直至接受退出命令);
2)单链表单元模块——实现单链表的抽象数据类型;
3)结点结构单元模块——定义单链表的结点结构。
各模块之间的调用关系如下:
主程序模块
单链表单元模块
结点结构单元模块
三、详细设计
3.1元素类型、结点类型和指针类型
typedefintStatus;
typedefintElemType;
typedefstructLNode{
float
coef;
//定义项的系数
ElemType
expn;
//定义项的指数
struct
LNode*next;
//指向下一个节点
}LNode,*LinkList;
StatusMakeNode(LinkList&
p,LinkListhead)
{//分配由p指向下一个多项式的头结点head、后继为空的结点,并返回TRUE,
//若分配失败,则返回FALSE
p=(LinkList)malloc(sizeof(structLNode));
if(!
p)returnfalse;
p=head;
p->
next=null;
returnture;
voidFreeNode(LinkList&
{//释放p所指结点
free(q1);
q1=q2;
q2=q2->
next;
}
3.2单链表的基本操作设置如下:
voidInsert(LinkListp,LinkListh);
//将节点p插入到多项式链表h
LinkListCreateLinkList(LinkListhead,intm);
//建立一个头指针为head、项数为m的一元多项式,并返回该多项式的头结点;
//若分配空间失败,则返回FALSE
voidDestroyLinkList(LinkListp);
//销毁多项式p
voidPrintLinkList(LinkListP);
//输出构造的一元多项式P
Statuscompare(LinkLista,LinkListb)
//节点进行比较:
a的指数>
b的指数
return1;
a的指数==b的指数
return0;
a的指数<
b的指数
return-1.
LinkListAddLinkList(LinkListpa,LinkListpb)
//求解并建立多项式a+b,返回其头指针
LinkListSubtractLinkList(LinkListpa,LinkListpb)
//求解并建立多项式a-b,返回其头指针
floatValueLinkList(LinkListhead,intx)
//输入x值,计算并返回多项式的值
LinkListDerivative(LinkListhead)
//求解并建立导函数多项式,并返回其头指针
LinkListMultiplyLinkList(LinkListpa,LinkListpb)
//求解并建立多项式a*b,返回其头指针
其中部分操作的伪码如下:
LinkListCreateLinkList(LinkListhead,intm)
{
p=head=(LinkList)malloc(sizeof(structLNode));
head->
next=NULL;
for(i=0;
i<
m;
i++)
p=(LinkList)malloc(sizeof(structLNode));
//建立新结点以接收数据
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
}//CreateLinkList
Statuscompare(LinkLista,LinkListb){
if(a&
&
b){
if(!
b||a->
expn>
b->
expn)return1;
elseif(!
a||a->
expn<
expn)return-1;
elsereturn0;
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
}//compare
floatValueLinkList(LinkListhead,intx){
for(p=head->
p;
p=p->
next){
t=1;
for(i=p->
expn;
i!
=0;
)
//i为指数的系数pow(x,i)
{if(i<
0){t/=x;
i++;
}
//指数小于0,进行除法
else{t*=x;
i--;
}//指数大于0,进行乘法
sum+=p->
coef*t;
}returnsum;
}//ValueLinkList
LinkListMultiplyLinkList(LinkListpa,LinkListpb){//求解并建立多项式a*b,返回其头指针
LinkListqa=pa->
LinkListqb=pb->
hf=(LinkList)malloc(sizeof(structLNode));
//建立头结点
hf->
for(;
qa;
qa=qa->
next)
{for(qb=pb->
qb;
qb=qb->
next)
{pf=(LinkList)malloc(sizeof(structLNode));
pf->
coef=qa->
coef*qb->
coef;
expn=qa->
expn+qb->
Insert(pf,hf);
}//调用Insert函数以合并指数相同的项
}returnhf;
}//MultiplyLinkList
3.3主函数和其他函数的伪码算法
voidmain(){//主函数
Initiation();
//多项式初始化
PrintCommand();
//输出菜单
while
(1){
//循环一直为真知道选择j||J即退出命令时,程序退出
\n请选择操作:
);
%c"
flag);
Interpter(flag);
//具体的操作命令
}}
//main
voidInitiation()
请输入a的项数:
%d"
m);
pa=CreateLinkList(pa,m);
//建立多项式a
请输入b的项数:
n);
pb=CreateLinkList(pb,n);
//建立多项式b
printf("
-------------------多项式已创建-----------------------\n"
}//Initiation
voidPrintCommand(){
//输出菜单
显示键入命令的提示信息;
Printf(’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’);
}//PrintCommand
voidInterpter(charflag){
switch(flag)
{case'
A'
:
case'
a'
{PrintLinkList(pa);
break;
case'
B'
b'
{PrintLinkList(pb);
case'
C'
case'
c'
{
pc=Derivative(pa);
PrintLinkList(pc);
break;
D'
d'
{Derivative(pb);
E'
e'
{ValueLinkList(pa,x));
F'
f'
{ValueLinkList(pb,x));
G'
g'
{AddLinkList(pa,pb);
}
H'
h'
{
SubtractLinkList(pa,pb));
PrintLinkList(pc);
I'
i'
{pc=MultiplyLinkList(pa,pb);
J'
j'
{DestroyLinkList(pa);
DestroyLinkList(pb);
exit(0);
default:
\n
您的选择错误,请重新选择!
\n"
}//Interpter
3.4函数的调用关系图反映了演示程序的层次结构:
Main
InitiationPrintCommandInterpter
CreateLinkListPrintLKDerivativeValueLKAddLKSubtractLKMultiplyLKDestroyLK
PrintLKPrintLKPrintLKPrintLKexit(0)
说明LK:
LinkList即多项式节点
函数说明:
PrintCommand();
//输出菜单
Interpter();
PrintLinkList();
//打印多项式(降序输出)
Derivative();
//多项式求导
ValueLinkList();
//多项式求值
AddLinkList();
//两个多项式相加
SubtractLinkList();
//两个多项式相减
MultiplyLinkList();
//两个多项式相乘
DestroyLinkList();
//销毁多项式
compare();
//两个节点比较
CreateLinkList();
//创建多项式
Insert();
//将节点插入已知多项式中
四、调试分析
4.1刚开始的时候由于对多项式的减法考虑不周全,代码很复杂,后来经过仔细思考,减法时把每项的系数变成它的相反数,然后调用加法的函数即可,但是实现了减法之后要把系数恢复,不然会影响后面的运算。
4.2求多项式在x处的值的函数在刚开始的时候出现过警告,虽然警告不会影响程序的运行,但是运算的结果不精确。
之前函数的类型是int,但是里面的多项式的系数是浮点型的,而sum又是整型的,但是这样得不到小数点后面的数值,导致结果不精确。
后来经改进,把函数的类型及sum的类型均改为float型。
五、用户使用手册
5.1此程序的整体架构:
主函数里有三个函数,Initialization(初始化)、PrintCommand(打印命令)、Interpret(解释并执行命令)。
在Interpret函数中调用了其他的函数,以达到执行命令的目的。
5.2在输入命令时要注意在输入多项式的每一项的系数和指数必须有空格,否则可能会解释命令出错。
在完成每一条的命令输入时要键入Enter.
六、测试结果
(程序输入的相关命令)
七、附录(源代码):
#include<
stdio.h>
malloc.h>
stdlib.h>
#define
TRUE
1
FALSE
0
OK
ERROR
INFEASIBLE-1
OVERFLOW-2
/*全局节点初始化多项式节点为空*/
staticLinkListpa=NULL;
static
LinkListpb=NULL;
LinkListpc=NULL;
/*将节点p插入到多项式链表h*/
voidInsert(LinkListp,LinkListh){
if(p->
coef==0)free(p);
//系数为0的话释放结点
else{LinkListq1,q2;
q1=h;
q2=h->
while(q2&
q2->
expn){
//查找插入位置
if(q2&
expn==q2->
expn){//将指数相同相合并
q2->
coef+=p->
free(p);
coef){//系数为0的话释放结点
q1->
next=q2->
free(q2);
else{
//指数为新时将结点插入
p->
next=q2;
next=p;
//创建一元多项式
LinkListCreateLinkList(LinkListhead,intm){
//建立一个头指针为head、项数为m的一元多项式
inti;
LinkListp;
//调用Insert函数插入结点
voidDestroyLinkList(LinkListp){
LinkListq1,q2;
q1=p->
q2=q1->
while(q1->
{free(q1);
voidPrintLinkList(LinkListP){
LinkListq=P->
intflag=1;
//项数计数器
q)
{//若多项式为空,输出0
putchar('
0'
return;
}
while(q)
if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项
coef!
=1&
q->
=-1)
{//系数非1或-1的普通情况
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
else
{
coef==1)
expn)putchar('
1'
elseprintf("
coef==-1)
-1"
expn==1)printf("
-X"
-X^%d"
q=q->
flag++;
//节点进行比较
//
return1
return0
a的指数<
return-1
b)
{if(!
LinkListAddLinkList(LinkListpa,LinkListpb){//求解并建立多项式a+b,返回其头指针
LinkListheadc,hc,q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 简单 计数器 实验 报告