数据结构课程方案编译已通过Word格式文档下载.docx
- 文档编号:15910599
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:16
- 大小:36.41KB
数据结构课程方案编译已通过Word格式文档下载.docx
《数据结构课程方案编译已通过Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程方案编译已通过Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
1.4计算多项式在x处的值;
1.5多项式a和b相加,建立多项式a+b;
1.6多项式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->
expn<
q->
expn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
②若p->
expn=q->
expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->
expn>
expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
三、测试数据:
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.
四、概要设计
1、元素类型、结点类型和指针类型:
typedefstructPolynomial{
floatcoef。
//系数
intexpn。
//指数
structPolynomial*next。
}*Polyn,Polynomial。
2、建立一个头指针为head、项数为m的一元多项式,建立新结点以接收数据,调用Insert函数插入结点:
PolynCreatePolyn(Polynhead,intm>
{
inti。
Polynp。
p=head=(Polyn>
malloc(sizeof(structPolynomial>
head->
next=NULL。
for(i=0。
i<
m。
i++>
{
p=(Polyn>
printf("
请输入第%d项的系数与指数:
"
i+1>
scanf("
%f%d"
&
p->
coef,&
Insert(p,head>
}
returnhead。
}
3、主函数和其他函数:
voidmain(>
{
intm,n,a,x。
charflag。
Polynpa=0,pb=0,pc。
}
floatValuePolyn(Polynhead,intx>
//输入x值,计算并返回多项式的值
五、调用关系图
<
图1)
六、程序代码:
#include<
stdio.h>
stdlib.h>
//定义多项式的项
structPolynomial*next。
voidInsert(Polynp,Polynh>
if(p->
coef==0>
free(p>
//系数为0的话释放结点
else
Polynq1,q2。
q1=h。
q2=h->
next。
while(q2&
&
p->
expn<
q2->
{//查找插入位置
q1=q2。
q2=q2->
}
if(q2&
expn==q2->
{//将指数相同相合并
coef+=p->
coef。
if(!
q2->
coef>
{//系数为0的话释放结点
q1->
next=q2->
free(q2>
}
{//指数为新时将结点插入
next=q2。
next=p。
PolynCreatePolyn(Polynhead,intm>
{//建立一个头指针为head、项数为m的一元多项式
Polynp。
//建立新结点以接收数据
//调用Insert函数插入结点
voidDestroyPolyn(Polynp>
{//销毁多项式p
q1=p->
q2=q1->
while(q1->
next>
free(q1>
voidPrintPolyn(PolynP>
Polynq=P->
intflag=1。
//项数计数器
q>
{//若多项式为空,输出0
putchar('
0'
\n"
return。
}
while(q>
if(q->
0&
flag!
=1>
+'
//系数大于0且不是第一项
coef!
=1&
=-1>
{//系数非1或-1的普通情况
%g"
q->
expn==1>
X'
elseif(q->
X^%d"
{
coef==1>
{
1'
elseprintf("
coef==-1>
-1"
-X"
-X^%d"
q=q->
flag++。
intcompare(Polyna,Polynb>
if(a&
b>
b||a->
b->
return1。
elseif(!
a||a->
return-1。
elsereturn0。
a&
//a多项式已空,但b多项式非空
elsereturn1。
//b多项式已空,但a多项式非空
PolynAddPolyn(Polynpa,Polynpb>
{//求解并建立多项式a+b,返回其头指针
Polynqa=pa->
Polynqb=pb->
Polynheadc,hc,qc。
hc=(Polyn>
//建立头结点
hc->
headc=hc。
while(qa||qb>
qc=(Polyn>
switch(compare(qa,qb>
case1:
qc->
coef=qa->
expn=qa->
expn。
qa=qa->
break。
case0:
{
coef+qb->
qb=qb->
case-1:
coef=qb->
expn=qb->
}
if(qc->
=0>
next=hc->
next=qc。
hc=qc。
elsefree(qc>
//当相加系数为0时,释放该结点
returnheadc。
PolynSubtractPolyn(Polynpa,Pol
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 方案 编译 通过
![提示](https://static.bdocx.com/images/bang_tan.gif)