一元稀疏多项式简单计数器Word文件下载.docx
《一元稀疏多项式简单计数器Word文件下载.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式简单计数器Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
(7)互换上述测试数据中的前后两个多项式
、概要设计
为实现上述程序的功能,应以带头结点的单链表表示多项式。
为此,需要一个抽象数据类型:
单链表。
2.1单链表的抽象数据类型定义
ADTLinkList{
数据对象:
D={ai|ai∈TermSet,i=1,2,…,m,m≥0
TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:
R1={<
ai-1,ai>
ai-1,ai∈D且ai-1中的指数值<
ai中的指数值,i=2,…,n}
基本操作:
CreatLinkList(&
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