fname数据结构课程设计报告一元多项式的计算.docx
《fname数据结构课程设计报告一元多项式的计算.docx》由会员分享,可在线阅读,更多相关《fname数据结构课程设计报告一元多项式的计算.docx(16页珍藏版)》请在冰豆网上搜索。
fname数据结构课程设计报告一元多项式的计算
题目:
一元多项式的计算
班级_____软件1102______
姓名_______朱正品_______
学号_____112001230______
一元多项式的加减
一.实验课题:
运用数据结构的知识编写一个程序,要求此程序能够进行2个一元多项式的加减,并将答案输出在屏幕上。
二.问题分析:
一元多项式可以看做是n个元素的相加,而这n个元素的唯一差别就在于系数和指数,运用数据结构的知识可以通过将2个一元多项式的系数和指数分别存储在2个线性表中,然后通过线性表的检索比较指数,若指数相同就将系数相加,将结果存储在另一个线性表中。
三.程序运行环境:
MicrosoftVisualStudio
四:
概要设计
存储结构:
一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
1.单连表的抽象数据类型定义:
ADTList{数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList(&L)
//操作结果:
构造一个空的线性表
CreatPolyn(&L)
//操作结果:
构造一个以单连表存储的多项试
DispPolyn(L)
//操作结果:
显示多项试
Polyn(&pa,&pb)
//操作结果:
显示两个多项试相加,相减的结果
}ADTList
2.本程序包含模块:
typedefstructLNode//定义单链表
{
}LNode,*LinkList;
voidInitList(LinkList&L)//定义一个空表
{}
voidCreatPolyn(LinkList&L)//用单链表定义一个多项式
{}
voidDispPolyn(LinkListL)//显示输入的多项式
{}
voidPolyn(LinkList&pa,LinkList&pb)
{}
voidmain()
{
//定义一个单连表;
cout<***************"<LNode*L1,*L2;
Polyn(L1,L2);}
2.1加,减操作模块——实现加减操作
各模块之间的调用关系如下:
主程序模块
加法操作模块减法操作模块
基本算法:
1、输入输出
(1)功能:
将要进行运算的多项式输入输出。
(2)数据流入:
要输入的多项式的系数与指数。
(3)数据流出:
合并同类项后的多项式。
(4)程序流程图:
多项式输入流程图如图1所示。
图表1
(5)测试要点:
输入的多项式是否正确,若输入错误则重新输入
2、多项式的加法
(1)功能:
将两多项式相加。
(2)数据流入:
输入函数。
(3)数据流出:
多项式相加后的结果。
(4)程序流程图:
多项式的加法流程图如图2所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
图表2
3、多项式的减法
(1)功能:
将两多项式相减。
(2)数据流入:
调用输入函数。
(3)数据流出:
多项式相减后的结果。
(4)程序流程图:
多项式的减法流程图如图3所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
图表3
五.调试分析
采用单连表形式按照指数降序排列建立并输出多项式;在相加,相减的过程中如果指数相同就执行系数相加,相减,否则就把大的项直接写入。
完成两个多项式的相加、相减;将从新得到的单连表结果输出;该算法的时间复杂度为两个多项式的项式之和
六:
调试结果
1.测试的数据及结果
相乘:
相加:
相减:
程序代码:
#include
#include
typedefstructnode{
intxs;
intzs;
structnode*next;
}Dnode,*Dnodelist;/*定义结构体*/
DnodelistCreat_node(void)/*链表初始化*/
{
DnodelistD;
D=(Dnodelist)malloc(sizeof(Dnode));
if(D)
D->next=NULL;
returnD;
}
intInsert_node(DnodelistD,intxs,intzs)/*插入函数*/
{
Dnodelistp;
Dnodelistq;
Dnodelistr;
p=D;
while(p->next)
{
r=p;
p=p->next;
if(zs==p->zs)/*指数相等,系数直接相加,结束*/
{
p->xs=p->xs+xs;
return1;
}
elseif(zs>p->zs)/*指数大于当前数据的,将数据插入当前数据之前,结束*/
{
q=Creat_node();
q->xs=xs;
q->zs=zs;
r->next=q;
q->next=p;
return1;
}
}/*while(p->next)*/
q=Creat_node();/*要插入的数据指数最小,直接插入至链表最后*/
q->xs=xs;
q->zs=zs;
q->next=p->next;
p->next=q;
return1;
free(p);
free(q);
free(r);
}
DnodelistCreat_Dmeth(intlength)/*创建多项式*/
{
inti,m,n;
DnodelistD;
D=Creat_node();
for(i=0;i{
scanf("%d,%d",&m,&n);
Insert_node(D,m,n);/*调用插入函数,将输入的系数指数插入链表*/
}
returnD;
}
DnodelistMulresult(DnodelistD1,DnodelistD2)/*多项式相乘*/
{
DnodelistD;
Dnodelistp,q;
intx,z;
D=Creat_node();
p=D1->next;
q=D2->next;
while(q)
{
while(p)
{
x=p->xs*q->xs;/*系数相乘,指数相加*/
z=p->zs+q->zs;
Insert_node(D,x,z);
p=p->next;
}
p=D1->next;
q=q->next;
}
returnD;
}
DnodelistAddresult(DnodelistD1,DnodelistD2)/*多项式相加*/
{
DnodelistD;
Dnodelistp,q;
intx,z;
D=Creat_node();
p=D1->next;
q=D2->next;
while(q)
{
x=q->xs;
z=q->zs;
Insert_node(D,x,z);
q=q->next;
}
while(p)
{
x=p->xs;
z=p->zs;
Insert_node(D,x,z);
p=p->next;/*直接插入数据,利用插入函数可完成该功能*/
}
returnD;
}
DnodelistSubresult(DnodelistD1,DnodelistD2)/*多项式相减*/
{
DnodelistD;
Dnodelistp,q;
intx,z;
D=Creat_node();
p=D1->next;
q=D2->next;
while(p&&q)
{
if((p->zs)<(q->zs))/*指数小(1的数据在2中不存在),直接插入*/
{
x=-(q->xs);/*由于是式1减式2,所以系数置负*/
z=q->zs;
Insert_node(D,x,z);
q=q->next;
}
elseif((p->zs)>(q->zs))/*指数大(2的数据在1中不存在),直接插入*/
{
x=p->xs;
z=p->zs;
Insert_node(D,x,z);
p=p->next;
}
else/*指数相同的先将系数相减,再插入*/
{
z=q->zs;
x=(p->xs)-(q->xs);
Insert_node(D,x,z);
p=p->next;
q=q->next;
}
}/*while(p&&q)*/
while(p)
{
x=p->xs;
z=p->zs;
Insert_node(D,x,z);
p=p->next;
}
while(q)
{
x=-(q->zs);
z=q->zs;
Insert_node(D,x,z);
q=q->next;
}/*将未遍历完的数据直接插入*/
returnD;
}
Dnodelistselect(DnodelistD1,DnodelistD2)/*选择函数*/
{
DnodelistD;
ints;
printf("请选择:
\n1:
相乘\n2:
相加\n3:
相减\n");
scanf("%d",&s);
switch(s)
{
case1:
D=Mulresult(D1,D2);/*调用相乘函数*/
printf("相乘结果(系数,指数):
\n");
break;
case2:
D=Addresult(D1,D2);/*调用相加函数*/
printf("相加结果(系数,指数):
\n");
break;
case3:
D=Subresult(D1,D2);/*调用相减函数*/
printf("相减结果(系数,指数):
\n");
break;
default:
printf("无此选项\n");
break;
}
returnD;
}
voidShow(DnodelistD)/*显示(输出)函数*/
{
Dnodelistr;
r=D->next;
while(r)
{
printf("(%d,%d)+",r->xs,r->zs);
r=r->next;
}
printf("\n");
}
voidmain()
{
DnodelistD1,D2,D;
intlength;
D1=Creat_node();
D2=Creat_node();/*D1为多项式1,D2为多项式2,初始化*/
printf("输入多项式1的组数:
\n");
scanf("%d",&length);
printf("输入多项式1系数,指数:
(%d组)\n",length);
D1=Creat_Dmeth(length);/*创建多项式1*/
printf("输入多项式2的组数:
\n");
scanf("%d",&length);
printf("输入多项式2系数,指数:
(%d组)\n",length);
D2=Creat_Dmeth(length);/*创建多项式2*/
D=select(D1,D2);/*选择运算方式*/
Show(D);/*输出显示*/
getchar();
}