一元稀疏多项式计算器实验报告+程序文档格式.docx
《一元稀疏多项式计算器实验报告+程序文档格式.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器实验报告+程序文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
为实现处理,设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在原来的链表上后移。
四、实验程序
//头文件
#include<
stdio.h>
malloc.h>
stdlib.h>
//定义多项式的项
typedefstructPolynomial{
floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){
if(p->
coef==0)free(p);
//系数为0的话释放结点
else
{
Polynq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
p->
q2->
expn)
{//查找插入位置
q1=q2;
q2=q2->
}
if(q2&
expn==q2->
{//将指数一样相合并
q2->
coef+=p->
coef;
free(p);
if(!
coef)
{//系数为0的话释放结点
q1->
next=q2->
free(q2);
}
{//指数为新时将结点插入
p->
next=q2;
next=p;
}
}
PolynCreatePolyn(Polynhead,intm){
//建立一个头指针为head、项数为m的一元多项式
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"
&
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
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++;
intpare(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(pare(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;
intValuePolyn(Polynhead,intx){
//输入x值,计算并返回多项式的值
intsum=0,t;
for(p=head->
t=1;
for(i=p->
i!
=0;
)
if(i<
0){t/=x;
i++;
}//指数小于0,进展除法
else{t*=x;
i--;
}//指数大于0,进展乘法
sum+=p->
coef*t;
returnsum;
PolynDerivative(Polynhead){
//求解并建立导函数多项式,并返回其头指针
Polynq=head->
next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(structPolynomial));
hd->
expn!
{//该项不是常数项时
p2=(Polyn)malloc(sizeof(structPolynomial));
p2->
coef=q->
coef*q->
expn-1;
next=p1->
//连接结点
p1->
next=p2;
p1=p2;
returnhd;
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;