您的位置:首页 > 其它

线性表之单链表实现一元多项式相加,求值,求导

2014-09-21 18:11 711 查看
一元多项式定义:

设a0,a1,a2,…,an-1,an都是数域F中的数(注:1,2,……,n-1,n均为a的下角标),n是非负整数,那么表达式

anx^n +an-1x^(n-1)+…+a2x^2 +a1x + a0(an≠0) (1)

叫做数域F上一个文字x的多项式或一元多项式。在多项式(1)中,a0叫做零次多项式或常数项,a1x叫做一次项,一般,aix叫做i次项,ai叫做i次项的系数。一元多项式用符号f(x),g(x),…来表示。

说一下思路,利用带有两个数据元素的链表实现加法运算,数据域分别保存coef(系数)和exp(指数),运算时比较两链表当前数据域指数大小,三种情况结合正确组装出和链表并存入原链表LA,(注意本问题多项式的指数按从小到大顺序排列)。,代码如下:

#include<iostream>
using namespace std;
typedef struct Polynode
{
int coef;
int exp;
struct Polynode *next;
}Polynode,*Polylist;

void init_linklist(Polylist *L)/*对单链表进行初始化*/
{
*L=(Polylist)malloc(sizeof(Polynode)); /*申请结点空间*/
(*L)->next=NULL;                      /*置为空表*/
}

void polycreate(Polylist head)
{
Polynode *rear, *s;
int c,e;
rear=head;	                            /* rear 始终指向单链表的尾,便于尾插法建表*/
cin>>c>>e;                  /*键入多项式的系数和指数项*/
while(c!=0)	                            /*若c=0,则代表多项式的输入结束*/
{
s=(Polynode*)malloc(sizeof(Polynode));	/*申请新的结点*/
s->coef=c;
s->exp=e;
rear->next=s;		/*在当前表尾做插入*/
rear=s;
cin>>c>>e;
}
rear->next=NULL;	/*将表的最后一个结点的next置NULL,以示表结束*/
}

void  polyadd(Polylist polya, Polylist polyb)
/*此函数用于将两个多项式相加,然后将和多项式存放在多项式polya中,并将多项式ployb删除*/
{
Polynode  *p, *q, *pre, *temp;
int sum;
p=polya->next;   /*令 p和q分别指向polya和polyb多项式链表中的第一个结点*/
q=polyb->next;
pre=polya;  /* r指向和多项式的尾结点*/
while (p!=NULL && q!=NULL) /*当两个多项式均未扫描结束时*/
{
if  (p->exp < q->exp)
/*如果p指向的多项式项的指数小于q的指数,将p结点加入到和多项式中*/
{
pre->next=p;
pre=p;
p=p->next;
}
else
if ( p->exp == q->exp)  /*若指数相等,则相应的系数相加*/
{
sum=p->coef + q->coef;
if (sum != 0)
{
p->coef=sum;
pre->next=p;
pre=p;
p=p->next;
temp=q;
q=q->next;
free(temp);
}
else
{
temp=p;
p=p->next;
free(temp);
/*若系数和为零,则删除结点p与q,并将指针指向下一个结点*/
temp=q;
q=q->next;
free(temp);
}
}
else
{
pre->next=q;
pre=q; /*将q结点加入到和多项式中*/
q = q->next;
}
}
if(p!=NULL)  /*多项式A中还有剩余,则将剩余的结点加入到和多项式中*/
pre->next=p;
else      /*否则,将B中的结点加入到和多项式中*/
pre->next=q;
}
void print(Polylist L)
{
Polylist p;
p=L->next;
while(p!=NULL)
{
cout<<p->coef<<"  "<<p->exp<<"  ";
p=p->next;
}
cout<<endl;
}
int main()
{

Polylist LA,LB;
init_linklist(&LA);
init_linklist(&LB);
polycreate(LA);
print(LA);

polycreate(LB);
print(LA);

polyadd(LA,LB);
print(LA);
return 0;
}
挺经典的,,,考试神马的简单问题也许用得到

求值,求导,相加三个都有的

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct
{
float a[MAX];
int length;
}Lnode;

void Create(Lnode *f)//一元多项式的创建
{

int i,n;

printf("请输入一元多项式的最高幂次:");
scanf("%d",&n);

printf("请一次性输入多项式各幂次的系数\n");
printf("常数项:");
scanf("%f",&f->a[0]);
for(i=1;i<=n;i++)
{
printf("%d次项:",i);
scanf("%f",&f->a[i]);
}

f->length=n;
}

void Calculate(Lnode *f,float x)//一元多项式的求值
{

int i,j;

float t,sum=0;

for(i=0;i<=f->length;i++)
{
t=f->a[i];
for(j=i;j>0;j--)
t*=x;
sum+=t;
}

printf("一次多项式的值为:");
printf("%f\n",sum);
}

void Plus(Lnode *f1,Lnode *f2)//一元多项式的相加
{

int i,j;
Lnode *f;

f=(Lnode*)malloc(sizeof(Lnode));
if(f1->length<=f2->length)
{
for(i=0;i<=f1->length;i++)
f->a[i]=f1->a[i]+f2->a[i];
for(i=f1->length+1;i<f2->length;i++)
f->a[i]=f2->a[i];
f->length=f2->length;
}
else
{
for(i=0;i<=f2->length;i++)
f->a[i]=f1->a[i]+f2->a[i];
for(i=f2->length+1;i<=f1->length;i++)
f->a[i]=f1->a[i];
f->length=f1->length;
}

printf("相加后的多项式为:\n");
if(f->a[0]!=0)
printf("f=%f",f->a[0]);
else
printf("f=");

for(i=1;i<=f->length;i++)
{
if(f->a[i]>0)
printf("+%f",f->a[i]);
if(f->a[i]<0)
printf("%f",f->a[i]);
for(j=1;j<=i;j++)
printf("x");
}

printf("\n");
}

void Qiudao(Lnode *f)//一元多项式的求导
{

int i,j;

for(i=1;i<=f->length;i++)
f->a[i]=f->a[i]*i;

printf("一元多项式的导数为:\n");
printf("f'=");

for(i=1;i<=f->length;i++)
{
if(i==1)
printf("%f",f->a[i]);
else if(f->a[i]>0)

printf("+%f",f->a[i]);
else      if(f->a[i]<0)
printf("%f",f->a[i]);
for(j=0;j<i;j++)    printf("x");
}
printf("\n"); }
void main()//主函数
{
int k;  float x;
Lnode *f1,*f2;
printf("请输入进行的操作:\n");
printf("1------------多项式求值;\n");
printf("2------------两多项式求和;\n");
printf("3------------多项式求导;\n");
scanf("%d",&k);   switch(k)
{
case 1:
f1=(Lnode *)malloc(sizeof(Lnode));     Create(f1);
printf("请输入x的值:");
scanf("%f",&x);
Calculate(f1,x);
break;
case 2:
f1=(Lnode *)malloc(sizeof(Lnode));
f2=(Lnode *)malloc(sizeof(Lnode));     Create(f1);     Create(f2);        Plus(f1,f2);     break;
case 3:
f1=(Lnode *)malloc(sizeof(Lnode));
Create(f1);
Qiudao(f1);     break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: