数据结构 一元稀疏多项式计算器Word下载.docx

上传人:b****8 文档编号:22292535 上传时间:2023-02-03 格式:DOCX 页数:16 大小:68.22KB
下载 相关 举报
数据结构 一元稀疏多项式计算器Word下载.docx_第1页
第1页 / 共16页
数据结构 一元稀疏多项式计算器Word下载.docx_第2页
第2页 / 共16页
数据结构 一元稀疏多项式计算器Word下载.docx_第3页
第3页 / 共16页
数据结构 一元稀疏多项式计算器Word下载.docx_第4页
第4页 / 共16页
数据结构 一元稀疏多项式计算器Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构 一元稀疏多项式计算器Word下载.docx

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

数据结构 一元稀疏多项式计算器Word下载.docx

③若p->

expn>

expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。

4、数据测试

(1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

(2)、(2x+5x^8-3.1x^11)-(7-5x^8+11x^9)=-3.1x^11-11x^9+10x^8+12x-7;

(3)(2x+5x^8-3.1x^11)*(7-5x^8+11x^9)=34.1x^20+15.5x^19+55x^17-25x^16-21.7x^11+22x^10-10x^9+35x^8+14x

三、概要设计

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)malloc(sizeof(structPolynomial));

printf("

请输入第%d项的系数与指数:

"

i+1);

scanf("

%f%d"

&

p->

coef,&

expn);

Insert(p,head);

}

returnhead;

}

3、主函数和其他函数:

voidmain()

{

intm,n,a,x;

charflag;

Polynpa=0,pb=0,pc;

}

4、数据结构:

带头结点单链表抽象数据类型的结点结构定义如下:

typedefstructPolynode//多项式结点

intcoef;

intexp;

Polynode*next;

}Polynode,*Polylist;

5.模块划分:

(1)带头结点的多项式的建立函数PolylistPolycreate()

(2)带头结点的多项式的降幂输出函数voidprintf(Polylistpoly)

(3)带头结点的多项式的相加函数PolylistPolyadd(Polylista,Polylistb)

(4)带头结点的多项式的相减函数PolylistPolysub(Polylista,Polylistb)

(5)主函数voidmain()

四、程序代码:

#include<

stdio.h>

stdlib.h>

//定义多项式的项

voidInsert(Polynp,Polynh){

if(p->

coef==0)free(p);

//系数为0的话释放结点

else

Polynq1,q2;

q1=h;

q2=h->

next;

while(q2&

&

p->

expn<

q2->

expn)

{//查找插入位置

q1=q2;

q2=q2->

}

if(q2&

expn==q2->

{//将指数相同相合并

coef+=p->

coef;

free(p);

if(!

q2->

coef)

{//系数为0的话释放结点

q1->

next=q2->

free(q2);

}

{//指数为新时将结点插入

next=q2;

next=p;

PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式

//建立新结点以接收数据

//调用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->

coef>

0&

flag!

=1)putchar('

+'

//系数大于0且不是第一项

coef!

=1&

=-1)

{//系数非1或-1的普通情况

%g"

q->

coef);

expn==1)putchar('

X'

elseif(q->

expn)printf("

X^%d"

{

coef==1)

{

expn)putchar('

1'

elseprintf("

coef==-1)

-1"

expn==1)printf("

-X"

-X^%d"

q=q->

flag++;

intcompare(Polyna,Polynb){

if(a&

b)

b||a->

b->

expn)return1;

elseif(!

a||a->

expn)return-1;

elsereturn0;

a&

b)return-1;

//a多项式已空,但b多项式非空

elsereturn1;

//b多项式已空,但a多项式非空

PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针

Polynqa=pa->

Polynqb=pb->

Polynheadc,hc,qc;

hc=(Polyn)malloc(sizeof(structPolynomial));

//建立头结点

hc->

headc=hc;

while(qa||qb)

qc=(Polyn)malloc(sizeof(structPolynomial));

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,Polynpb){//求解并建立多项式a-b,返回其头指针

Polynh=pb;

Polynp=pb->

Polynpd;

while(p)

{//将pb的系数取反

coef*=-1;

p=p->

pd=AddPolyn(pa,h);

for(p=h->

p;

p=p->

next)//恢复pb的系数

returnpd;

PolynMultiplyPolyn(Polynpa,Polynpb){//求解并建立多项式a*b,返回其头指针

Polynhf,pf;

hf=(Polyn)malloc(sizeof(structPolynomial));

//建立头结点

hf->

for(;

qa;

qa=qa->

for(qb=pb->

qb;

qb=qb->

pf=(Polyn)malloc(sizeof(structPolynomial));

pf->

coef*qb->

expn+qb->

Insert(pf,hf);

//调用Insert函数以合并指数相同的项

returnhf;

请输入a的项数:

%d"

m);

pa=CreatePolyn(pa,m);

//建立多项式a

请输入b的项数:

n);

pb=CreatePolyn(pb,n);

//建立多项式b

//输出菜单

printf("

**************************************************\n"

*多项式操作程序*\n"

**\n"

*A:

输出多项式aB:

输出多项式b*\n"

**\n"

*C:

输出a+bD:

输出a-b*\n"

**\n"

*E:

输出a*bF:

退出程序*\n"

*************************************************\n"

while(a)

\n请选择操作:

%c"

flag);

switch(flag)

case'

A'

:

a'

{

printf("

\n多项式a="

PrintPolyn(pa);

break;

}

B'

case'

b'

printf("

\n多项式b="

PrintPolyn(pb);

break;

C'

c'

pc=AddPolyn(pa,pb);

\na+b="

PrintPolyn(pc);

case'

D'

d'

pc=SubtractPolyn(pa,pb);

\na-b="

E'

e'

pc=MultiplyPolyn(pa,pb);

\na*b="

F'

f'

\n感谢使用此程序!

DestroyPolyn(pa);

DestroyPolyn(pb);

a=0;

break;

default:

\n您的选择错误,请重新选择!

五、调用关系图

六、调试分析

1、由于对算法的推敲不足,在程序调试出气,犯了些小错误,如指针定义时忽略了“*”;

2、算法的分析

建立多项式的时间复杂度为O(n),降幂输出多项式序列算法,由于是对指数做的循环,每次循环都需要从首元结点查找到表尾,假设多项式开始为升幂排列,如x1+x2+x3+x4+……xn,(这里n<

=20)其时间复杂度为n(n+1)/2,若指数不是连续的,则其时间复杂度加上O(n),所以此算法的时间复杂度为O(n2)。

假设a有M项,b有N项,则加法和减法算法的时间复杂度度为M+N,算法中两多项式相加和相减时,a,b均需按升幂顺序输入结点。

七、测试结果

(1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7)

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

当前位置:首页 > 人文社科 > 视频讲堂

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

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