线性表之单链表实现一元多项式相加,求值,求导
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,(注意本问题多项式的指数按从小到大顺序排列)。,代码如下:
求值,求导,相加三个都有的
设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; } }
相关文章推荐
- 用链式线性表实现两个一元多项式相加
- 数据结构(12)线性表之C++实现一元多项式相加
- 单链表实现一元多项式相加
- 利用单链表实现一元多项式的表示及相加
- (链表实现)写出两个一元多项式相加的算法
- (链表实现)写出两个一元多项式相加的算法
- 02-线性结构2. 一元多项式求导 (25)
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)
- 用链表实现一元多项式的加、减、乘、求导运算
- PAT 数据结构 02-线性结构2. 一元多项式求导 (25)
- 一元多项式加法——单链表实现
- Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)
- Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)
- 02-线性结构2. 一元多项式求导 (25)
- 用链表实现一元多项式的加、减、乘、求导运算
- 02-线性结构2. 一元多项式求导 (25)
- 线性表的应用---一元多项式的表示与相加
- 多项式相加 单链表实现
- 一元多项式的求导---使用链表实现的代码
- 02-线性结构2. 一元多项式求导 (25)