数据结构C语言一元稀疏多项式计算器.docx
《数据结构C语言一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构C语言一元稀疏多项式计算器.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构C语言一元稀疏多项式计算器
实验报告一
题目:
编制一个一元稀疏多项式计算器
班级:
*******姓名:
王雪学号:
130****8030完成日期:
2014.4.5
一、需求分析
1、一元稀疏多项式简单计算器的功能是:
1.1输入并建立多项式;
1.2输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
1.3多项式a和b相加,建立多项式a+b;
1.4多项式a和b相减,建立多项式a-b。
2、设计思路:
2.1定义线性表的动态分配顺序存储结构;
2.2建立多项式存储结构,定义指针*next
2.3利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式
2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
多项式显示的格式为:
c1x^e1+c2x^e2+…+cnx^en
3、设计思路分析
要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为
序数coef
指数expn
指针域next
运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polynp中的结点插入到单链表polynh中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
二、概要设计
为实现上述程序的功能,应以带头结点的单链表表示多项式。
为此,需要一个抽象数据类型:
单链表。
2.1单链表的抽象数据类型定义
ADTLinkList{
数据对象:
D={ai|ai∈TermSet,i=1,2,…,m,m≥0
TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:
R1={ai-1,ai∈D且ai-1中的指数值基本操作:
CreatLinkList(&p,m)
操作结果:
输入m项的系数和指数,建立一元多项式p。
DestoryLinkList(&p)
初始条件:
一元多项式p已存在。
操作结果:
销毁一元多项式p.
PrintLinkList(p)
初始条件:
一元多项式p已存在。
操作结果:
打印输出一元多项式p.
AddLinkList(&pa,&pb)
初始条件:
一元多项式pa和pb已存在。
操作结果:
完成多项式的相加运算,即:
pa=pa+pb,并销毁一元多项式pb.
SubtractLinkList(&pa,&pb)
初始条件:
一元多项式pa和pb已存在。
操作结果:
完成多项式的想减运算,即:
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)
{//释放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的指数
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 {
p=(LinkList)malloc(sizeof(structLNode)); //建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
returnhead;
}//CreateLinkList
Statuscompare(LinkLista,LinkListb){
if(a&&b){
if(!
b||a->expn>b->expn)return1;
elseif(!
a||a->expnexpn)return-1;
elsereturn0;}
elseif(!
a&&b)return-1;//a多项式已空,但b多项式非空
elsereturn1;//b多项式已空,但a多项式非空
}//compare
floatValueLinkList(LinkListhead,intx){ //输入x值,计算并返回多项式的值
for(p=head->next;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->next;
LinkListqb=pb->next;
hf=(LinkList)malloc(sizeof(structLNode));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next) {for(qb=pb->next;qb;qb=qb->next)
{pf=(LinkList)malloc(sizeof(structLNode));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);}//调用Insert函数以合并指数相同的项
}returnhf;}//MultiplyLinkList
3.3主函数和其他函数的伪码算法
voidmain(){//主函数
Initiation(); //多项式初始化
PrintCommand();//输出菜单
while
(1){ //循环一直为真知道选择j||J即退出命令时,程序退出
printf("\n请选择操作:
");
scanf("%c",&flag); Interpter(flag); //具体的操作命令
}} //main
voidInitiation()
{
printf("请输入a的项数:
");
scanf("%d",&m);
pa=CreateLinkList(pa,m);//建立多项式a
printf("请输入b的项数:
");
scanf("%d",&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':
case'b':
{PrintLinkList(pb);break;}
case'C':
case'c':
{AddLinkList(pa,pb)