一元稀疏多项式的加法运算数据结构实习Word下载.docx

上传人:b****6 文档编号:20090359 上传时间:2023-01-16 格式:DOCX 页数:14 大小:103.01KB
下载 相关 举报
一元稀疏多项式的加法运算数据结构实习Word下载.docx_第1页
第1页 / 共14页
一元稀疏多项式的加法运算数据结构实习Word下载.docx_第2页
第2页 / 共14页
一元稀疏多项式的加法运算数据结构实习Word下载.docx_第3页
第3页 / 共14页
一元稀疏多项式的加法运算数据结构实习Word下载.docx_第4页
第4页 / 共14页
一元稀疏多项式的加法运算数据结构实习Word下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

一元稀疏多项式的加法运算数据结构实习Word下载.docx

《一元稀疏多项式的加法运算数据结构实习Word下载.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式的加法运算数据结构实习Word下载.docx(14页珍藏版)》请在冰豆网上搜索。

一元稀疏多项式的加法运算数据结构实习Word下载.docx

当多项式的某一项的系数为+1或者-1时侧该项多项式的输出形式为X^ei或-X^ei;

当该项的系数为正时输出+ciX^ei,当为负数时则输出ciX^ei

3.程序所能达到的功能

输入并建立多项式,实现一元稀疏多项式的相加并输出。

4.注意:

所有多项式都必须以指数升密形式输入。

5.测试数据为

(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)

(2)(x+x100)+(x100+x200)=(x+2x100+x200)

(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)

二.设计

1.设计思路

(1).储存结构:

链式存储

(2).主要算法基本思路

首先定义一个多项式的结构体,存放多项式每一项的系数和指数以及next指针;

然后定义两个指针,第一个指针指向第一个多项式,第二个指针指向第二个多项式。

然后比较两个多项式第一项的指数的大小,如果两个多项式的指数相同,则将他们的系数相加,指数不变;

如果不同则比较他们指数的大小,并将指数小的放在第一项。

然后指向指数小的那一项的指针后移,它的指数去和刚才必然的那一项的指向相比较……直至两个多项式相加完。

其中如果某二项的系数相加后为0,则该项不输出。

相加时的程序如下:

pnode*add(pnode*heada,pnode*headb)//多项式相加//

{

pnode*headc,*p,*q,*s,*r;

floatx;

p=heada;

//p指针指向第一个多项式的第一项//

q=headb;

//q指针指向第二个多项式的第一项//

headc=(pnode*)malloc(sizeof(pnode));

//为两式相加的结果c申请内存//

r=headc;

//r指向结果//

while(p!

=NULL&

&

q!

=NULL)//判断两个式子都合法//

{

if(p->

e==q->

e)//指数相同时系数相加//

{x=p->

c+q->

c;

if(x!

=0)

{

s=(pnode*)malloc(sizeof(pnode));

s->

c=x;

s->

e=p->

e;

r->

next=s;

r=s;

}

q=q->

next;

p=p->

//指向多项式的下一项//

elseif(p->

e>

q->

e)//多项式按升幂排序//

c=q->

e=q->

q=q->

else

c=p->

p=p->

}

=NULL)//第一个式子不为0时的相加法则//

s=(pnode*)malloc(sizeof(pnode));

r->

r=s;

p=p->

while(q!

=NULL)//第二个式子不为0的相加法则//

r->

next=NULL;

headc=headc->

//c的指向依次指向下一项//

returnheadc;

//返回两式相加的结果//

}

2.设计表示

(1)函数调用关系图

main->

create()->

add()->

display()->

display()

(2)函数规格接口说明

pnode*creat()/*此函数时用来创建多项式的*/

voiddisplay(pnode*head)/*head为每个多项式的头指针*/

pnode*add(pnode*heada,pnode*headb)/*headaheadb为两个多项式的头指针*/

3.实现注释

(1)根据提示输入多项式每一项的指数和系数,结束该多项式的输入时系数和指数都应该输入0。

(2)可以输入任何指数型式的多项式。

4.详细设计(主要算法的细化)

输出函数如下:

voiddisplay(pnode*head)//多项式输出//

pnode*p;

intone_time=1;

p=head;

=NULL)//判断头结点非空//

if(one_time==1)

if(p->

e==0)//当指数为0即X^o时只需要输出系数c//

printf("

%f"

p->

c);

elseif(p->

c==1)//系数为1时输出X^ei//

x^%d"

e);

elseif(p->

c==-1)//系数为-1时输出-X^ei//

-x^%d"

c>

0)//系数大于0时系数前面带“+”//

+%fx^%d"

c,p->

c<

0)//系数为副时原样输出//

%fx^%d"

one_time=0;

else{

e==0)

{if(p->

c!

printf("

+%f"

}

+x^%d"

0)//系数大于0时系数前面带“+”

0)//系数为副时原样输出//;

e)

printf("

\n"

);

主函数如下:

voidmain()

pnode*a,*b,*c;

//定义三个多项式//

inputthefirst:

//输入第一个多项式//

a=creat();

//调用创建函数,创建第一个多项式//

inputthesecond:

//输入第二个多项式//

b=creat();

//调用创建函数,创建第二个多项式//

c=add(a,b);

//调用相加函数//

thefirst:

"

display(a);

//输出第一个多项式//

thesecond:

display(b);

//输出第二个多项式//

sumis:

display(c);

//输出两多项式相加的结果//

相加部分见算法设计部分。

三.调试分析

1.调试遇到的主要问题以及解决方案:

a刚写程序时输出时没有分系数大于0和小于0分,输出的形式都为printf(“%fX^%d”,p->

e),结果两个多项式相加时当某相邻两项时,中间的加号没有表示出来。

所以我就将系数分为大于0和小于0来分,输出形式为if(p->

0)printf("

elseif(p->

b刚开始多项式输入时没有按升幂的形式输入,结果运行的结果怎么都不对,然后将它按升幂的形式输入后就可以了。

c刚开始时没有考虑结束多项式的输入时该则么弄,结果运行时一直都在输入第一个多项式,怎么都结束不了,直到将结束位的系数和指数都设置为0时才解决了这个问题。

2.时间和空间复杂度的分析:

时间复杂度为:

O(n)

空间复杂度为:

3改进设想

A由于两个多项式的某两项相加为0时是不输出数的,所以当两个多项式相加为0时,结果什么都不输出为空值,一直想办法改进,却没有什么结果,所以想在这方面改进一下;

B由于多项式的系数为正时,输出的形式中带有一个“+”,所以当多项式的第一项的系数为正值时总会带有一个“+”,觉得很别扭。

但如果输出形式中不带“+”,结果中两个不同项之间有没有“+”,与偶以很苦恼。

C由于没有菜单函数,所以每次只能显示本次相加的两的多项式,而不能显示前一次货前几次的多项式,所以想在此方面做一些改进,产生一个菜单,包括:

进去多项式相加程序帮助功能.退出。

让用户在没有退出之前都能看见每一次多项式相加的过程和结果,并在不懂的时候能获得帮助。

4.经验与体会:

一直都知道C语言学的很差,但是最基本的编程还是能完成的,但是这次实习让我知道原来的我的编程能力是如此之差,它让我很深刻的认识到我的基础功没有打扎实,我还要多下功夫。

学数据结构式好多东西都是纸上谈兵,以为懂了,结果上机的时候什么都不知道。

这次实习也让我认识到时间的重要性,我知道光有利临时没有用的,必须将理论与实际结合起来。

四.运行结果

验证

(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)

截图为

验证

(2)(x+x100)+(x100+x200)=(x+2x100+x200)

验证(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)

六.源程序清单

#include<

stdio.h>

malloc.h>

stdlib.h>

conio.h>

typedefstructpnode//定义结构体//

floatc;

//系数//

inte;

//指数//

structpnode*next;

//指向多项式下一项的指针//

}pnode;

pnode*creat()//创建多项式//

intm;

floatn;

pnode*head,*rear,*s;

head=(pnode*)malloc(sizeof(pnode));

//申请内存空间//

rear=head;

inputc:

scanf("

&

n);

//输入系数//

inpute:

//输入指数//

%d"

m);

while(n!

=0)//当系数不为0时输入多项式//

s->

c=n;

s->

e=m;

//next指针置空//

rear->

//定义next指针//

rear=s;

//输入下一项的系数//

//输入下一下的指数//

head=head->

returnhead;

//返回头结点//

voiddisplay(pnode*head)//多项式输出//

voidmain()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1