数据结构C语言一元稀疏多项式计算器Word文档下载推荐.docx
《数据结构C语言一元稀疏多项式计算器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构C语言一元稀疏多项式计算器Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
指数expn
指针域next
运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polynp中的结点插入到单链表polynh中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
①若p->
expn<
q->
expn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
②若p->
expn=q->
expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->
expn>
expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
二、概要设计
为实现上述程序的功能,应以带头结点的单链表表示多项式。
为此,需要一个抽象数据类型:
单链表。
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.
}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,返回其头指针
其中部分操作的伪码如下:
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->
b->
expn)return1;
elseif(!
a||a->
expn)return-1;
elsereturn0;
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
}//compare
floatValueLinkList(LinkListhead,intx){
//输入x值,计算并返回多项式的值
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’);
}//PrintCommand
voidInterpter(charflag){
switch(flag)
{case'
A'
:
case'
a'
{PrintLinkList(pa);
break;
case'
B'
b'
{PrintLinkList(pb);
case'
C'
case'
c'
{AddLinkList(pa,pb)