数据结构课程设计(一元稀疏多项式计算器).doc
《数据结构课程设计(一元稀疏多项式计算器).doc》由会员分享,可在线阅读,更多相关《数据结构课程设计(一元稀疏多项式计算器).doc(11页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计(一元稀疏多项式计算器).doc](https://file1.bdocx.com/fileroot1/2022-10/19/292f9de9-dd78-4382-b054-77bbbcc264b5/292f9de9-dd78-4382-b054-77bbbcc264b51.gif)
实习报告:
1.5题一元稀疏多项式计算器
实习报告
题目:
设计一个一元稀疏多项式简单计算器
班级:
计科一班姓名:
康宇学号:
10061014完成日期:
2013.4.15
一、需求分析
1、一元稀疏多项式简单计算器的功能是:
1)输入并建立多项式;
2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
3)多项式a和b相加,建立多项式a+b;
4)多项式a和b相减,建立多项式a-b。
5)计算多项式在x处的值;
6)求多项式a、b的导函数;
2、测试数据:
1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);
2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)
=(-7.8x^15-1.2x^9+12x^-3-x);
3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);
4、(x+x^3)+(-x-x^3)=0;
5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);
6、(x+x^2+x^3)+0=x+x^2+x^3.
二、概要设计
为实现上述程序功能,应以有序链表来表示多项式的系数和指数。
定义线性表的动态分配顺序存储结构;建立多项式存储结构,定义指针*next利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式
演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
1、元素类型、结点类型和指针类型:
typedefstructLNode
{
floatxishu;//系数
intzhishu;//指数
structLNode*next;
}LNode,*Linklist;
2、建立两个全局链表指针,
LinklistList1=NULL;
LinklistList2=NULL;
用来存放两个多项式,然后在main()函数里调用输入函数。
3、本程序包括7个模块
1)主程序:
Voidmain()
{
While
(1)
{
输出菜单;
接受命令;
处理命令;
If(命令==退出)
则程序退出;
}
释放链表;
}
2)输入函数:
VoidInput()
{
调用插值函数In(List1)处理链表一;
调用插值函数In(List2)处理链表二;
}
3)输出函数:
VoidOutput()
{
调用输值函数Out(List1)处理链表一;
调用输值函数Out(List2)处理链表一;
}
4)相加函数:
VoidAdd()
{
if(List1节点指数>List2节点指数)
输出List1节点;
指针后移;
elseif(List1节点指数输出List2节点;
指针后移;
else
输出两节点相加后的值;
两链表指针都后移;
if(链表1到头)
输出链表2剩余的节点;
else(即链表二到头)
输出链表1剩余的节点;
}
5)相减函数:
VoidSub()
{
if(List1节点指数>List2节点指数)
输出List1节点;
指针后移;
elseif(List1节点指数输出List2节点;(系数要取负再输出)
指针后移;
Else
两链表指针都后移;
if(链表1到头)
输出链表2剩余的节点;
else(即链表二到头)
输出链表1剩余的节点;
}
6)求值函数:
voidCalc()
{
输入x的值;
依次调用链表一的节点,求出单项式的值相加后输出;
}
7)求导函数:
voidDaohanshu()
{
输出多项式一的导函数;
}
三、详细设计
#include
#include
#include
typedefstructLNode//元素类型
{
floatxishu;
intzhishu;
structLNode*next;
}LNode,*Linklist;
LinklistList1=NULL;
LinklistList2=NULL;
LinklistIn(LinklistL)//依次往链尾插
{
Linklistp;
floata;
intb;
Linklisthead=(Linklist)malloc(sizeof(LNode));
L=head;
head->zhishu=0;//head->zhishu头结点放的是多项式的项数
p=head;
p->next=NULL;
printf("请输入一个多项式:
\n");
while(scanf("%f%d",&a,&b)&&(a||b))//默认多项式是按指数由小到大输入
{
//printf("%f%d\n",a,b);
(head->zhishu)++;
//printf("%3d\n",L->zhishu);
Linklistq=(Linklist)malloc(sizeof(LNode));
q->xishu=a;
q->zhishu=b;
if(p->next==NULL)
{
p->next=q;
q->next=NULL;
p=head;
}
else
{
if(p->next->zhishu<=q->zhishu)
{
q->next=p->next;
p->next=q;
p=head;
}
else
{
p=p->next;
}
}
}
printf("您已成功输入一个多项式!
!
\n");
returnL;
}
voidInput()
{
List1=In(List1);
List2=In(List2);
}
voidOut(LinklistL)
{
Linklistp;
p=L->next;
printf("此多项式有%3d项",L->zhishu);
while(p!
=NULL)//按指数由大到小输出
{
printf("%0.1f%3d",p->xishu,p->zhishu);
p=p->next;
}
printf("\n");
}
voidOutput()
{
printf("第一个多项式为:
\n");
Out(List1);
printf("第二个多项式为:
\n");
Out(List2);
}
voidAdd()
{
Linklistp1,p2;
p1=List1->next;
p2=List2->next;
printf("相加后的多项式为:
\n");
while(p1&&p2)
{
if(p1->zhishu>p2->zhishu)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
elseif(p1->zhishuzhishu)
{
printf("%0.1f%3d",p2->xishu,p2->zhishu);
p2=p2->next;
}
else
{
printf("%0.1f%3d",p1->xishu+p2->xishu,p1->zhishu);
p1=p1->next;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2)
{
printf("%0.1f%3d",p2->xishu,p2->zhishu);
p2=p2->next;
}
}
else
{
while(p1)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
}
printf("\n");
}
voidSub()
{
Linklistp1,p2;
p1=List1->next;
p2=List2->next;
printf("相减后的多项式为:
\n");
while(p1&&p2)
{
if(p1->zhishu>p2->zhishu)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
elseif(p1->zhishuzhishu)
{
printf("%0.1f%3d",-p2->xishu,p2->zhishu);
p2=p2->next;
}
else
{
if(p1->xishu-p2->xishu!
=0)
{
printf("%0.1f%3d",p1->xishu-p2->xishu,p1->zhishu);
}
p1=p1->next;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2)
{
printf("%0.1f%3d",-p2->xishu,p2->zhishu);
p2=p2->next;
}
}
else
{
while(p1)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
}
printf("\n");
}
voidCalc()
{
intx;
doublesum=0;
Linklistp;
printf("请输入x的值:
");
scanf("%d",&x);
p=List1->next;
while(p)
{
sum+=p->xi