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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               
一元多项式定义:
设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 expstruct 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 100typedef 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;   } }

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43685243/article/details/84107123