数据结构多项式相加实验报告.docx
《数据结构多项式相加实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构多项式相加实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构多项式相加实验报告
数据结构多项式相加实验报告
篇一:
数据结构实验多项式加法
数据结构实验报告
实验名称:
多项式加减法
学号:
1XX10419
姓名:
林强
实验日期:
一、实验目的
通过实现多项式的加减法,对链表有更深入的了解
二、实验具体内容
1、实验题目1:
(1)题目设计一个一元稀疏多项式简单的加减法计算器
实
现要求:
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式:
A(x)?
7?
3x?
9x8?
5x17;
B(x)?
8x?
22x7?
9x8
(2)输出多项式
(3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C
(4)选作:
多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D
(2)分析
1:
本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型,
指数为整数,输出的结果也为系数和指数。
(1)输入的形式和输入值的范围:
输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。
输入值的范围:
a为实数,b为整数。
(2)输出形式:
输出多项式的系数和多项式未知数X的指数即(a,b)形式。
(3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果
2:
整个程序运行期间实行动态创建节点,一边输入数据,
一边创建节点当将全部数据输入到单链表中后再调用多项式加法这
个函数,并一边实现多项式的相加,一边释放节点,有效防止了
在程序反复运行过程中可能出现系统空间不够分配的现象
(3)实验代码
typedefintStatus;
#defineOVERFLOW-1
#definenull0
typedefstructLnode{
floatcoef;//
存储项系数
intexpn;//
存储项指数
structLnode*next;
}Lnode,*LinkList;
typedefLinkListpolynomial;
StatusInitList_L(LinkList&L){//
初始化头节点
L=(LinkList)malloc(sizeof(Lnode));
if(!
L)
return(-1);
L->next=null;
return1;
}
voidAddPolyn(polynomialpa,polynomialpb){
//实现两个多项式相加的算法
floatx;
polynomialqa;
polynomialqb;
polynomials;
polynomialu;
qa=pa->next;qb=pb->next;s=pa;
while(qa&&qb){
if(qa->expnexpn){
s=qa;
qa=qa->next;
}
elseif(qa->expn==qb->expn){
x=qa->coef+qb->coef;
if(x!
=0){
qa->coef=x;
s=qa;
qa=qa->next;
u=qb;
qb=qb->next;
free(u);
}
else{
s->next=qa->next;
free(qa);
qa=s->next;
u=qb;
qb=qb->next;
free(u);
}
}
elseif(qa->expn>qb->expn){
u=qb->next;
s->next=qb;
s=qb;
qb->next=qa;
qb=u;
}
}
if(qb)
qa->next=qb;
free(pb);
}
voidmain(){
floata;
intb;
polynomialL1;
polynomialL2;
LinkListq;
LinkListp;
LinkListm;
LinkListn;
InitList_L(L1);
q=L1;
InitList_L(L2);
p=L2;
cout 请输入数据:
" for(;;){
cin>>a;
cin>>b;
if(a==0&&b==0)
break;
m=newLnode;
m->coef=a;
m->expn=b;
q->next=m;
q=m;
q->next=null;
}//
循环输入第一个多项式的系数与指数
for(;;){
cin>>a;
cin>>b;
if(a==0&&b==0)
break;
n=newLnode;
n->coef=a;
n->expn=b;
p->next=n;
p=n;
p->next=null;
}//
循环输入第二个多项式的系数与指数
AddPolyn(L1,L2);//
调用多项式相加的算法
while((L1->next)!
=null){
coutnext->coefnext->expn L1=L1->next;
}//
输出计算结果
}
三、实验小结
通过编写多项加法这个程序,我将自己所学到的创建链表,
初始化链表和多项式加法算法都应用了一次,这使我们不仅仅只是理论化的学习书本上的知识,而是将学习到的理论知识应用到实际的操作中来增强我们的实际操作能力,这使我增加了实际操作经验,也使我通过实际操作来认识到自己在程序编写上的不足从而增强了我的实际编写程序的能力。
篇二:
数据结构实验报告《一、多项式及其运用》
中南大学物理学院
数据结构实验报告----
一元多项式相加及其运用
专业班级
时间:
XX年10月18日
数据结构实验报告----
一元多项式相加及其运用
【问题描述】
设计一个一元稀疏多项式简单计算器
【基本要求】
一元稀疏多项式简单计算器的功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,?
?
?
cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b。
【运用拓展】
(1)计算多项式在x处的值;
(2)多项式a和b相乘,建立乘积多项式ab;
(3)计算器的仿真友好界面。
【设计思路分析】
(1)解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表。
(2)运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题
(3)设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
【测试数据】
多项式a:
6x+3x^5-7.1x^11
多项式b:
2-5x^5+11x^9
若计算a+b则有:
(6x+3x^5-7.1x^11)+(2-5x^5+11x^9)=(-7.1x^11+11x^9-2x^5+6x+2)等。
【操作界面显示】
1:
建立多项式的操作:
2:
输出多项式及计算x的值
3:
进行运算操作:
4:
结束程序:
【程序代码】
#include//调用输入输出函数
#include
typedefstructPolynomial//定义一个Polyn结构体
{floatcoef;intexp;//系数指定为浮点型,指数指定为整型
structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){//查找位置插入新链节
if(p->coef==0)free(p);//p系数为0的话释放结点
else{//否则查找插入位置
Polynq1,q2;
q1=h;q2=h->next;
while(q2&&p->expexp)//指数较大则插前面
{q1=q2;q2=q2->next;}
if(q2&&p->exp==q2->exp)//将指数相同相合并
{q2->coef+=p->coef;
free(p);
if(!
q2->coef)//系数为0的话释放结点
{
q1->next=q2->next;
free(q2);
}
}
else{p->next=q2;q1->next=p;}//指数为新时将结点插入
}//第一个else
}//voidInsert
PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));//开辟多项式地址空间
head->next=NULL;//指定表尾,然后采用尾插法输入多项式
for(i=0;i {
p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->coef,&p->exp);
Insert(p,head);//调用Insert函数插入结点
}
returnhead;
}
voidPrintPolyn(PolynP)//输出多项式
{Polynq=P->next;
intflag=1;//项数计数器
if(!
q){//若多项式为空,输出0
篇三:
一元多项式相加的实验报告
《数据结构》实验报告
1、实验名称:
实现一元多项式的加法
2、实验日期:
XX-3-7
3、基本要求:
1)编程实现一元多项式的加法;
2)设计一个测试主函数。
4、实验目的:
通过实验使学生掌握链表的最基本和最主要的操作:
插入和删除操作。
5、测试数据:
随意输入两个一元多项式的系数和指数:
第一个:
系数:
4867;指数:
2345
第二个:
系数:
5938;指数:
1356
两式相加后输出结果。
6、算法思想或算法步骤:
1)用尾插入法创建单链表
(PLoy*create_Ploy_LinkList(void))
2)输出单链表中所有结点的值,得到一元多项式
(voidoutput_Ploy_LinkList(PLoy*L,charch))
3)进行多项式的相加,采用链式存储表示加法,根据结点类型定义,若指数不同,则进行链表的合并;若指数相同,则进行系数相加;
若和为0,则去掉结点;若和不为0,则修改结点的系数域。
(PLoy*add_ploy(PLoy*La,PLoy*Lb))
7、模块划分:
1)头文件stdiob.h。
头文件stdiob.h中包括:
结点结构体定义、一元多项式的系数和指数的输入、一元多项式的输出以及两式相加输出结果的操作等;
2)实现文件yydxsxj.cpp。
包含主函数intmain(),其功能是测试所设计的一元多项式加法的正确性。
8、数据结构:
链表中的结点的结构体定义如下:
typedefstructNode
{
floatcoef;/*系数部分*/
intexpn;/*指数部分*/
structNode*next;
}PloyNode;
9、源程序:
源程序存放在两个文件中,即头文件stdiob.h和实现文件yydxsxj.cpp。
//头文件stdiob.h
typedefstructNode
{
floatcoef;/*系数部分*/
intexpn;/*指数部分*/
structNode*next;
}PloyNode;
PloyNode*create_Ploy_LinkList(void)
{
/*尾插入法创建单链表,链表的头结点head作为返回值*/floatcoef;intexpn;
PloyNode*head,*p,*q;
head=p=(PloyNode*)malloc(sizeof(PloyNode));
p->next=NULL;/*创建单链表的表头结点head*/
while
(1)
{
printf("\n请输入一元多项式的系数(0表示结束):
");scanf("%f",&coef);
if(coef==0)break;
else
{
printf("\n请输入一元多项式的指数:
");scanf("%d",&expn);
q=(PloyNode*)malloc(sizeof(PloyNode));q->coef=coef;/*指数部分赋值*/q->expn=expn;/*系数部分赋值*/q->next=p->next;p->next=q;p=q;
/*钩链,新创建的结点总是作为最后一个结点*/}
}
return(head);
}
voidoutput_Ploy_LinkList(PloyNode*L,charch)
/*输出以L为头结点的单链表中所有结点的值*/{
PloyNode*p;
p=L->next;/*使p指向第一个结点*/
if(p==NULL)printf("\n此多项式为空!
!
\n\n");else
{
printf("f(x)=\n",ch);
while(p!
=NULL)
{
if(p->coef>0)
printf("%+g",p->coef);
elseprintf("%g",p->coef);
if(p->expn!
=0)
{
printf("X^");
printf("%d",p->expn);
}
p=p->next;
}
}/*移动指针p*/
printf("\n\n");
}
PloyNode*add_Ploy(PloyNode*La,PloyNode*Lb)
{
PloyNode*Lc,*pc,*pa,*pb,*ptr;floatx;Lc=pc=La;pa=La->next;pb=Lb->next;
if(pa==NULL&&pb==NULL)printf("两个式子之和也为空项");while(pa!
=NULL&&pb!
=NULL)
{
if(pa->expnexpn)