数据结构-多项式相加

数据结构-多项式相加
数据结构-多项式相加

数据结构课程设计

2012年12月

班级:XXX

学号:XXX

姓名: XXX

指导教师:XXX

一元稀疏多项式计算器

【问题描述】

设计一个一元稀疏多项式简单计算器

【基本要求】

一元多项式简单计算器的基本功能是:

1,输入并建立多项式;

2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;

3,多项式a和b相加,建立多项式a+b;

4,多项式a和b相减,建立多项式a-b.

【算法设计思想】

①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem

其中,p1是指数为ei的项的非零系数,且满足0≦e1

((p1,e1),(p2,e2),……,(pm,em))便可惟一确定多项式pn(x)。

②用两个带表头结点的单链表分别存储两个多项式

③根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;

④只需要将第二个多项式的系数改为其相反数,然后根据一元多项式相加的运算规则便可以得到其相应的“差多项式”

【实现提示】

用带表头结点的单链表存储多项式。

【程序代码】

#include

#include

typedef struct node

{

float coef;

int expn;

struct node *next;

}Lnode, *polynmial;

void create(polynmial &L); //输入并建立多项式L

void display(polynmial L); //显示,输出多项式L

void sort(polynmial &L); //多项式L按指数排序

void reverse(polynmial &L); //逆置

void select(); //用户选择加减操作

void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld

void create(polynmial &L) //输入并建立多项式L

{

int i, n;

static struct node *p;

scanf("%d", &n);

L = (struct node *)malloc (sizeof(struct node));

L->next = NULL;

for(i = 0; i < n; i++)

{

p = (struct node *)malloc(sizeof(struct node));

scanf("%f %d", &p->coef, &p->expn);

p->next = L->next;

L->next = p;

}

}

void display(polynmial L)//显示,输出多项式L

{

struct node *p, *q;

int flag = 0;

int k = 0;

q = L->next;

while(q)

if(q->coef != 0)

k++;

q = q->next;

}

printf("%d, ", k);

p = L->next;

if(p->coef != 0)

{

printf("%.1f,%d, ", p->coef, p->expn);

flag++;

}

for(p = p->next; p; p = p->next)

{

if(p->coef != 0)

{

printf("%.1f,%d, ", p->coef, p->expn);

flag++;

}

}

if(flag == 0)

printf("%d\n", flag);

else

printf("\n");

}

void sort(polynmial &L)//多项式L按指数排序{

polynmial p, q, r, u;

p = L->next;

L->next = NULL;

while(p != NULL)

{

r = L;

q = L->next;

while((q != NULL) && (q->expn <= p->expn)) {

r = q;

q = q->next;

}

u = p->next;

r->next = p;

p->next = q;

p = u;

}

void reverse(polynmial &L)//逆置

{

polynmial H;

static struct node *p, *q, *s;

H = (struct node*)malloc(sizeof(struct node));

H->next = NULL;

p = (struct node*)malloc(sizeof(struct node));

s = L->next;

p->coef = s->coef;

p->expn = s->expn;

p->next = s->next;

while(s)

{

p->coef = s->coef;

p->expn = s->expn;

p->next = s->next;

q = H->next;

H->next = p;

p->next = q;

p = (struct node*)malloc(sizeof(struct node));

s = s->next;

}

p = H->next;

q = L->next;

while(p)

{

q->coef = p->coef;

q->expn = p->expn;

q = q->next;

p = p->next;

}

}

void select() //用户选择加减操作

{

printf("请选择加减操作\n");

printf("1.两个一元多项式相加\n");

printf("2.两个一元多项式相减\n");

}

void add(polynmial La, polynmial Lb, polynmial &Lc)//多项式La,Lb相加{

struct node *pa, *pb;

static struct node *pc;

Lc = (struct node*)malloc(sizeof(struct node));

pa = La->next;

pb = Lb->next;

Lc->next = NULL;

while(pa && pb)

{

pc = (struct node*)malloc(sizeof(struct node)); if(pa->expn < pb->expn)

{

pc->next = Lc->next;

Lc->next = pc;

pc->coef = pa->coef;

pc->expn = pa->expn;

pa = pa->next;

}

else

if(pa->expn == pb->expn)

{

pc->next = Lc->next;

Lc->next = pc;

pc->expn = pa->expn;

pc->coef = pa->coef + pb->coef;

pa = pa->next;

pb = pb->next;

}

else

{

pc->next = Lc->next;

Lc->next = pc;

pc->coef = pb->coef;

pc->expn = pb->expn;

pb = pb->next;

}

}

while(pa)

{

pc = (struct node*)malloc(sizeof(struct node)); pc->next = Lc->next;

Lc->next = pc;

pc->coef = pa->coef;

pc->expn = pa->expn;

pa = pa->next;

}

while(pb)

{

pc = (struct node*)malloc(sizeof(struct node));

pc->next = Lc->next;

Lc->next = pc;

pc->coef = pb->coef;

pc->expn = pb->expn;

pb = pb->next;

}

}

void subtract(polynmial La, polynmial Lb, polynmial &Ld)//多项式La减去Lb,结果给Ld

{

struct node *pa, *pb;

static struct node *pd;

Ld = (struct node*)malloc(sizeof(struct node));

pa = La->next;

pb = Lb->next;

Ld->next = NULL;

while(pa && pb)

{

pd = (struct node*)malloc(sizeof(struct node));

if(pa->expn < pb->expn)

{

pd->next = Ld->next;

Ld->next = pd;

pd->coef = pa->coef;

pd->expn = pa->expn;

pa = pa->next;

}

else

if(pa->expn == pb->expn)

{

pd->next = Ld->next;

Ld->next = pd;

pd->expn = pa->expn;

pd->coef = pa->coef - pb->coef;

pa = pa->next;

pb = pb->next;

}

else

{

pd->next = Ld->next;

Ld->next = pd;

pd->coef = pb->coef;

pd->expn = pb->expn;

pb = pb->next;

}

}

while(pa)

{

pd = (struct node*)malloc(sizeof(struct node)); pd->next = Ld->next;

Ld->next = pd;

pd->coef = pa->coef;

pd->expn = pa->expn;

pa = pa->next;

}

while(pb)

{

pd = (struct node*)malloc(sizeof(struct node)); pd->next = Ld->next;

Ld->next = pd;

pd->coef = -pb->coef;

pd->expn = pb->expn;

pb = pb->next;

}

}

int main()

{

int sign;

polynmial La, Lb, Lc, Ld;

printf("请输入第一个多项式:\n");

create(La);

sort(La);

printf("请输入第二个多项式:\n");

create(Lb);

sort(Lb);

select();

scanf("%d", &sign);

switch(sign)

{

case 1:

printf("多项式之和为:\n");

add(La, Lb, Lc);

sort(Lc);

reverse(Lc);

display(Lc);

break;

default:

printf("多项式之差为:\n"); subtract(La, Lb, Ld); sort(Ld);

reverse(Ld);

display(Ld);

break;

}

return 0;

}

【程序运行截图】

数据结构实验多项式加法

数据结构实验报告 实验名称:多项式加减法 学号:1200310419 姓名:林强 实验日期:2015.5.05 一、实验目的 通过实现多项式的加减法,对链表有更深入的了解 二、实验具体内容 1、实验题目1: (1)题目设计一个一元稀疏多项式简单的加减法计算器 实现要求: 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式: 85 17 A+ x + x =; + 3 9 x 7 ) (x 79 8 x B- + = x 22 8 x ) (x (2)输出多项式 (3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C (4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D (2)分析 1:本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型, 指数为整数,输出的结果也为系数和指数。 (1)输入的形式和输入值的范围: 输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。输入值的范围:a为实数,b为整数。 (2)输出形式:输出多项式的系数和多项式未知数X的指数即(a,b)形式。 (3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果 2: 整个程序运行期间实行动态创建节点,一边输入数据, 一边创建节点当将全部数据输入到单链表中后再调用多项式加法这 个函数,并一边实现多项式的相加,一边释放节点,有效防止了 在程序反复运行过程中可能出现系统空间不够分配的现象 (3)实验代码 typedef int Status; #define OVERFLOW -1 #define null 0 typedef struct Lnode{

数据结构-多项式相加

数据结构课程设计 2012年12月 班级:XXX 学号:XXX 姓名: XXX 指导教师:XXX

一元稀疏多项式计算器 【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【算法设计思想】 ①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1

【实现提示】 用带表头结点的单链表存储多项式。 【程序代码】 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } } void display(polynmial L)//显示,输出多项式L { struct node *p, *q; int flag = 0; int k = 0; q = L->next; while(q)

一元多项式求和

一元多项式求和——链表编程 一.实验名称:一元多项式求和——链表编程。 二.实验环境:Windows Xp ,Vc++6.0。 三.实验目的: 1.掌握一元多项式的链表式存储算法; 2.掌握链表的结构定义; 3.采用尾插法生成单链表。 四.实验内容: 1.一元多项式的表示: 一元多项式可按升幂的形式表示为 12012()n e e e n n P x p p x p x p x =++++…… 其中:i e 为第i 项的指数,i p 是指数i e 的项的系数,且 121i n e e e e <=<=<=<=<=<=……。 则多项式()n P x 可以用一个线性表P 来表示:01(,)m P p p p =, ;同理,多项式 ()n Q x 可表示为01(,,)n Q q q q =…(mcodf=c;

数据结构实验一一元多项式相加

数据结构实验报告实验一:一元多项式相加 姓名:周成 学号: 专业:软件工程 任课教师:马慧珠 2013年12 月01 日

1.实验名称: 一元多项式相加 2.实验目的: 如何使用C语言实现链表的说明、创建以及结点的插入和删除等操作。 3.实验要求: 对一元多项式能实现输入、输出,以及两个一元多项式相加及结果显示。 4.实验内容: 一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。 核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式。运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描,比较qa和qb所指结点指数域的值,可能出现下列三种情况之一:

(1)qa->exp大于qb->exp,则qa继续向后扫描。 (2)qa->exp等于qb->exp,则将其系数相加。若相加结果不为零,将结果放入qa->coef中,并删除qb所指结点,否则同时删除qa和qb所指结点。 然后qa、qb继续向后扫描。 (3)qa->exp小于qb->exp,则将qb所指结点插入qa所指结点之前,然后qa、qb继续向后扫描。 扫描过程一直进行到qa或qb有一个为空为止,然后将有剩余结点的链表接在结果表上。所得pa指向的链表即为两个多项式之和。 5.实验程序代码及运行结果: #include"" #include<> #include<> #include<> #include<> #define NULL 0 typedef struct NODE {

多项式加法(C语言实现)

多项式加法 #include #include #define Max_Size 100 typedef struct node { float coef; int expn; struct node *next; }PolyNode; int CreCoeStr(float C[]) { char flag; int i=0; do { scanf("%f",&C[i++]); scanf("%c",&flag); } while (flag!='#'); return(i); } void CreExpStr(int E[]) { int i=0; char flag; do { scanf("%d",&E[i++]); scanf("%c",&flag); } while (flag!='#'); } void InitPolyList(PolyNode **sq) { if((*sq=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1); (*sq)->next=NULL; }

void CreatPolyList(PolyNode **sq,float C[],int E[],int num) { int i; PolyNode *s,*r=*sq; for(i=0;icoef=C[i]; s->expn=E[i]; r->next=s; r=s; } r->next=NULL; } void InsertSortPoly(PolyNode **sq) { PolyNode *p,*q,*r,*u; p=(*sq)->next; (*sq)->next=NULL; while (p) { r=*sq; q=(*sq)->next; while (q&&q->expn<=p->expn) { r=q; q=q->next; } u=p->next; p->next=r->next; r->next=p; p=u; } } void DispList(PolyNode *sq) { PolyNode *p=sq->next; while(p) { printf("(%7.2f,%d)",p->coef,p->expn); p=p->next; }

Matlab多变量二次多项式拟合

一、对Y 总做线性多项式拟合:0112288......Y b b X b X b X =+++ 设置显著性水平为0.05,拟合得到: B=[ 0b ,1b ,………., 8b ]= [-60.0349 12.5809 2.2002 -12.9863 20.4145 0.0266 5.1430 17.2416 151.6779] 对应的置信区间为: -161.4058 41.3359 -7.5870 32.7488 -25.5706 29.9709 -33.5089 7.5362 -0.3096 41.1386 -2.5989 2.6520 0.9830 9.3030 -3.2810 37.7642 -64.0209 367.3767 r 2= 0.7454 (越接近于1,回归效果越显著),F= 2.5616, p= 0.1163,(p>0.05, 可知回归模型不成立)。 残差图如下:

从残差图可以看出,除第一个数据和最后一个数据的残差离零点均较远,说明这两个数据可视为异常点,去掉这两个数据之后再做拟合得到: B=[ 0b ,1b ,………., 8b ]= [-478.8 15.7 1.8 -85.3 43 2.8 24.7 135.3 1131.9] 对应的置信区间为: -1048.7 91.1 7.5 23.9 -8 11.6 -183.5 12.8 10.5 75.5 -1.1 6.7 -2 51.4 -25.8 296.4 -206.7 2470.4 r 2= 0.9690 (越接近于1,回归效果越显著),F= 19.5530, p= 0.0023,(p<0.05, 可知回归模型成立)。 残差图如下:

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

Matlab中多项式的运算

Matlab中多项式的运算 1:直接键入p=[ 1 2 3 4]系统就自动建立起多项式y=x3+2x2+3x+4 2:利用roots(p)命令就可以求解这个多项式的根,例如:>> p=[1 2 3 4 ]; >> roots(p) ans = -1.6506 -0.1747 + 1.5469i -0.1747 - 1.5469i 3:利用poly(a)命令可以由多项式的根求解多项式的系数,其中a=[ 2 3]的表示形式。例如:>> a=[2 3]; >> poly(a) ans = 1 -5 6 则这个多项式为x2+5x+6. 4:多项式的相加减:若干个多项式相加减时就是把它们的系数数组直接相加减,但是系数数组元素的个数必须相等,若不够,可以补0,例如:a=[1 2 3 4]; b=[2 2 1 2]; c=a+b c =[ 3 4 4 6]

5:利用conv(a,b)命令可以求解a,b两个多项式的乘积。例如:>> a=[1 2]; >> b=[1 -2]; >> c=conv(a,b) c = 1 0 -4.因为a=x+2,b=x-2,所以a,b的乘积为c=x2-4. 6:利用polyder(a)命令可以去、求多项式的微分(求导数),例如:>> a=[1 2 0 -5 6]; >> b=polyder(a) b =4 6 0 -5,其中a=x4+2x3-5x+6;b=4x3+6x2-5. 6;给出x的范围,利用polyval(a)命令可以求出x对应的多项式的值,例如:>> x=-1:0.1:2; >> a=[1 2 0 -5 6]; >> y=polyval(a,x); >> plot(x,y) >> grid 绘图结果如下:

多项式求和

数据结构课程设计 题目:多项式运算 学生姓名:熊奉标 学号:10115011046 专业:计算机科学与技术 班级:10级(1)班 指导教师姓名及职称:陈正铭讲师 起止时间:2012 年2 月——2012 年4 月 1 需求分析

1.1 课题背景及意义 本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。在本课程设计中,程序设计语言为C++语言,程序运行平台为Windows/98/2000/XP,程序采用了链表存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的加、减、乘运算,勉强实现了设计目标,并且经过适当完善后,将可应用到实际中解决某些问题。 一元多项式的运算,虽然无法直接在除数学外的其他领域作出贡献,但是在数学上,它可以为人们解决一些自己动笔动手很难解决的问题,比如说那些很长很长的多项式,用笔算可能要算半天,但是用该程序,只需短短的几秒钟,所以它给人们带来了不少方便,同时相信它也能间接地为其他领域做出贡献。 1.2 课题要求 (1)掌握线性表的创建、插入、删除等基本运算。 (2)掌握线性表的顺序存储结构和链式存储结构 (3)掌握线性表的典型应用—多项式运算(加、减、乘)。 该程序的主要任务是将用户输入的多项式用线性表存储,然后通过对线性表的基本操作,而实现多项式之间的三则运算,把正确结果输出给用户。 1.3 软件格式规定 输入格式:有两类编辑框可供输入,系数编辑框、指数编辑框,在系数编辑框中允许输入浮点型数据,在指数编辑框中只允许输入整型数据。 正确的输入: f(x)=8X^6+4X^5-2X^4-12X^3-1X^1+10X^0 g(x)=2X^3-5X^2+1X^1 正确的输出结果: f(x)+g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -121.00X^3 -5.00X^2 +10.00 f(x)-g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -125.00X^3 +5.00X^2 -2.00X

matlab实验五多项式和符号运算

实验五:Matlab多项式和符号运算 一、实验目的 1.掌握Matlab多项式的运算。 2.了解符号运算。 二、实验内容 1.将多项式()(2)(3)(7)(1) =-+-+化为x的降幂排列。 P x x x x x syms x; y=(x-2)*(x+3)*(x-7)*(x+1); expand(y) ans = x^4-5*x^3-19*x^2+29*x+42 2.求一元高次方程的根。 98765432 --++--++= 53015027313658204100576-28800 x x x x x x x x x syms x y; y=x^9-5*x^8-30*x^7+150*x^6-1365*x^4-820*x^3+410 0*x^2+576*x-2880; solve(y,x) ans = 6.81947687944124431946 1.42761488953013276419+.8192491831*i 2.865487219+2.49263348244446271927*i

-1.887673354+1.812452594*i -.9583509633 -5.922730991 -1.887673354-1.812452594*i 2.865487219-2.49263348244446271927*i 1.42761488953013276419-.8192491831*i 3.求一元高次方程的根,并画出左边多项式函数在[2,2] x∈-区间内的曲线。 42 -+= x x 210 a=[1 0 -2 0 1]; r=roots(a) syms x; x=-2:2; y=[1 0 -2 0 1]; plot(x,y) r = 1.0000 + 0.0000i 1.0000 - 0.0000i -1.0000 -1.0000

一元多项式计算(数据结构课程设计)

一元多项式计算(数据结构课程设计)

一、系统设计 1、算法思想 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。 因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。主要用到了单链表的插入和删除操作。

(1)一元多项式加法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。P 的指数小于q的指数的话就应该复制q的节点到多项式中。P的指数大于q的指数的话,就应该复制p节点到多项式中。当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。 (2)一元多项式的减法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。p的指数小于q的指数的话,就应该复制q的节点到多项式中。P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。 2、概要设计 (1)主函数流程图: (注:a代表第一个一元二次方程,b代表第二个一元二次方程)

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 2011年1月1日

题目:一元多项式的运算 1、题目描述 一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。 在数学上,一个一元n次多项式P n(X)可按降序写成: P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0 它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示: P=(P n,P(n-1),......,P1,P0) 每一项的指数i隐含在其系数P i的序号里。 假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示: Q=(q m,q(m-1),.....,q1,q0) 不是一般性,假设吗吗m

一元多项式的计算数据结构课程设计

一元多项式的计算—加,减 摘要(题目)一元多项式计算 任务:能够按照指数降序排列建立并输出多项式; 能够完成两个多项式的相加、相减,并将结果输入; 目录 1.引言 2.需求分析 3.概要设计 4.详细设计 5.测试结果 6.调试分析 7.设计体会 8.结束语 一:引言: 通过C语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。按指数

降序排列。 二:需求分析 建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果 三:概要设计 存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。 1.单连表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={| ai-1, ai∈D,i=2,…,n} 基本操作: InitList(&L) //操作结果:构造一个空的线性表 CreatPolyn(&L) //操作结果:构造一个以单连表存储的多项试 DispPolyn(L) //操作结果:显示多项试 Polyn(&pa,&pb) //操作结果:显示两个多项试相加,相减的结果 } ADT List 2.本程序包含模块: typedef struct LNode //定义单链表 { }LNode,*LinkList; void InitList(LinkList &L) //定义一个空表 { } void CreatPolyn(LinkList &L) //用单链表定义一个多项式 { } void DispPolyn(LinkList L) //显示输入的多项式

两个一元多项式相加-c++版

《数据结构》实验报告 ——两个一元多项式相加 一、实验题目:两个一元多项式相加 二、实验内容: 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 三、设计思想: (1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。 (2)用成员函数merg(qList&l2)实现两多项式的相加。实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果 相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系 数)及它自己(指数)插入第一个多项式列表的后面。 (3)建立函数shu(double a[],int j)实现多项式的输入。 四、源程序代码 #include "stdafx.h" #include using namespace std; template class List { private: Telem * elem; int curlen; int maxlen; public: List(int maxsz=100):maxlen(maxsz) { curlen=0; elem=new Telem{maxlen}; }; List(Telem a[],int n,int maxsz=100):maxlen(maxsz) { curlen=n; elem=new Telem[maxlen]; for(int i=0;i

数据结构多项式求和

数据结构与算法 上机实验报告(一) 上机实验题目:一元多项式的表示及相加 专业班级:信息与计算科学1401班 姓名:邢鑫锋学号:140701211 设计室:理学院机房 上机时间: 2015-11-10 上机学时: 4学时 指导教师:杜洪波成绩:

一.实验目的: 1、进一步熟练掌握应用链表处理实际问题的能力 2、 二.实验内容: 1、一元多项式相加是通过键盘输入两个形如 P0+P1X1+P2X2+。。。+PnXn 的多项式,经过程序运算后在屏幕上输出它们的相加和。 2、 3、 三、程序及注释: #include #include #include typedef struct Node { int Data; Node* next; }SLNode; void listInt(SLNode **T) {if((*T=(SLNode*)malloc(sizeof(SLNode)))==NULL) exit(1); (*T)->next=NULL; }

void Create(SLNode *T,int n) { SLNode *p; int i; p=T; for(i=0;inext=q; printf("请输入链表数据\n"); scanf("%d",&q->Data); p=q; } } void Addtion(SLNode*T,SLNode*B,SLNode*C,int n) { int i; SLNode *p; p=C;

matlab多项式运算和方程组的求解

二、多项式 (1)多项式的表达式和创建 MATLAB中使用一维向量来表示多项式,将多项式的系数按照降幂次序存放在向量中。 例如:多项式2X4+3X3+5X2+1可以用向量[2 3 5 0 1]来表示。 例2-1,输入多项式3x4-10x3+15x+1000 在命令窗口输入: p=[3 -10 0 15 1000] 输出结果如下: (2)多项式求根 1、多项式的根 找出多项式的根,即使多项式为零的值,MATLAB提供了特定的函数roots求解多项式的根。 例2-2,求解多项式3x4-10x3+15x+1000的根。 在命令窗口输入:

输出的结果如下: 2、由根创建多项式 在MATLAB中,无论是一个多项式,还是它的根,都是以向量形式存储的,按照惯例,多项式是行向量,根是列向量。因此当我们给出一个多项式时,MATLAB 也可以构造出相应的多项式,这个过程需要使用函数poly。 例2-3 输入及结果 (3)多项式四则运算 1,多项式的加法 MATLAB并未提供一个特别的函数,如果两个多项式向量大小相同,那么多项

式相加时就和标准的数组加法相同。 例2-4 在命令窗口输入: a=[1 3 5 7 9];b=[1 2 4 6 8]; c=a+b 输出结果: C(x)=2x4+5x3+9x2+13x+17 2、多项式的乘法运算 在MATLAB中,函数conv支持多项式乘法(运算法则为执行两个数组的卷积)。例2-5 在命令窗口输入: a=[1 3 5 7 9]; b=[1 2 4 6 8]; c=conv(a,b) 输出的结果如下:

C(x)=x8+5x7+15x6+35x5+69x4+100x3+118x2+110x+72 PS:conv指令只能进行两个多项式的乘法,两个以上的多项式的乘法需要重复使用conv。 3、多项式的除法运算 在MATLAB中,由函数deconv完成的。 例2-6 在命令窗口输入: c=[1 5 15 35 69 100 118 110 72];b=[1 2 4 6 8]; [a,r]=deconv (c,b) 输出的结果: (4)多项式微分

数据结构——一元多项式的建立与相加

#include #include using namespace std; typedef struct PolyNode { int coef; //系数 int expn; //指数 struct PolyNode *next; } *PNode; //多项式结点的指针 void InitPoly(PNode &head,PNode &p) { head=(PNode)malloc(sizeof(struct PolyNode)); head->next=NULL; head->coef=0; head->expn=-1; p=head; } void CreatePoly(PNode &head,int a,int n) { PNode s; s=(PNode)malloc(sizeof(struct PolyNode)); //建立新的结点s->coef=a; s->expn=n; s->next=NULL; head->next=s; head=s; } void PrintPoly(PNode head) { int i=1;//控制第一对系数指数的显示 head=head->next;//指向表头结点的下一个 PNode p; p=head; while ((p->next)!=NULL) { if(i) //显示第一对的时候是不需要显示加号的 { if (p->expn==1) cout<coef<<"x"; else if (p->expn==0) cout<coef<

else cout<coef<<"x^"<expn; i=0; } else { if (p->expn==1) cout<coef<<"+x"; else if (p->expn==0) cout<<"+"<coef<coef<<"x^"<expn; } p=p->next; } cout<next; pb=pb->next; p=pc; while (pa!=NULL && pb!=NULL) { if (pa->expn>pb->expn) { s=(PNode)malloc(sizeof(struct PolyNode)); s->coef=pa->coef; s->expn=pa->expn; s->next=NULL; p->next=s; p=s; pa=pa->next; } else if (pa->expnexpn) { s=(PNode)malloc(sizeof(struct PolyNode)); s->coef=pb->coef; s->expn=pb->expn; s->next=NULL; p->next=s; p=s; pb=pb->next; }

二元多项式相加

华北水利水电大学数据结 构试验报告 ------二元多项式相加 2013160班

/*二元多项式的相加*/ #include #include struct node{ int coefficient; int expoentx; int exponety; struct node *next; }; typedef struct node *ptrtonode; ptrtonode bulidnode( void )//建立多项式链表 { int i, j; ptrtonode head, pnew, p; printf("请输入多项式含有的项数\n"); scanf("%d", &i); getchar(); if( (head = (ptrtonode)malloc( sizeof( struct node ))) == NULL ) return NULL; head->expoentx = 0; head->exponety = 0; head->next = NULL; head->coefficient = i;//将多项式的项数存在首节点 p = head; for( j = 0; j < i; j++ ) { if( (pnew = (ptrtonode)malloc( sizeof( struct node ))) == NULL ) return NULL; printf("请输入系数x和y的次幂中间用空格隔开\n"); scanf("%d%d%d", &pnew->coefficient, &pnew->expoentx, &pnew->exponety); fflush(stdin); p->next = pnew; p = pnew; p->next = NULL; } return head;

Matlab的应用-多项式函数及多项式拟合

Matlab的应用-多项式函数及多项式拟合 本节将向大家简要介绍matlab 在多项式处理方面的应用。 多项式函数主要有: roots 求多项式的根 poly 特征多项式 polyval 多项式的计算 poly2str(p,'x')多项式代换 polyfit 多项式曲线拟合 conv 多项式乘法 deconv 多项式除法 polyder 微分多项式 下面我们将介绍这些函数的用法: 1,roots---求多项式的根 格式:roots(c) 说明:它表示计算一个多项式的根,此多项式系数是向量c的元素.如果c有n+1个元素,那么此多项式为: c(1)*x^n+c(2)*x^(n-1)+c(3)*x^(n-2)+--+c(n)*x+c(n+1) 2,poly---特征多项式 格式:poly(a) 说明:(1)如果a是一个n阶矩阵,poly(a)是一个有n+1个元素的行向量,这n+1个元素是特征多项式的系数(降幂排列). (2)如果a是一个n维向量,则poly(a)是多项式(x-a(1))*(x-a(2))*..(x-a(n)),即该多项式以向量a的元素为根。 3,polyval—多项式计算 格式:polyval(v,s) 说明: 如果v是一个向量,它的元素是一个多项式的系数,那麽polyval(v,s)是多项式在s处的值. 如果s是一个矩阵或是一个向量,则多项式在s中所有元素上求值 例如: v=*1 2 3 4+;vv=poly2str(v,’s’)

(即v=s^3+2*s^2+3*s+4) s=2; x=polyval(v,s) x = 26 例如: v=[1 2 3 4]; s=[2 4]; polyval(v,s) ans=26 112 4,conv-多项式乘法 例:as=[1 2 3] as = 1 2 3 >> az=[2 4 2 1] az = 2 4 2 1 >> conv(as,az) ans = 2 8 16 17 8 3 conv(az,as) ans = 2 8 16 17 8 3 5,deconv-多项式除法 例:deconv(az,as)%返回结果是商式的系数 ans = 2 0 [awwq,qw]=deconv(az,as)%awwq是商式的系数,qw是余式的系数 awwq = 2 0 qw = 0 0 -4 1 6,polyder 微分多项式 polyder(as) ans = 2 2 7,polyfit--多项式曲线拟合 格式::polyfit(x,y,n) 说明:polyfit(x,y,n)是找n次多项式p(x)的系数,这些系数满足在最小二乘法意义下p(x(i)) ~= y(i). “人口问题”是我国最大社会问题之一,估计人口数量和发展趋势是我们制定一系列相关政策的基础。有人口统计年鉴,可查到我国从1949年至1994年人口数据资料如下: 年份 1949

多项式加法

班级:信息1301 姓名:胡苗苗 ======== 实习报告一“PolyAdd ”演示程序================== (一)、程序的功能和特点 功能:将两个多项式相加,利用单链表存储多项式,并实现多项式的加法。 特点:利用单链表进行多项式相加时,不生成新的结点,直接在原来的结点上运算。 (二)、程序中的算法设计 1.【逻辑结构与存储结构设计】 逻辑结构:存储多项式的的单链表是线性结构。 存储(物理)结构:存储多项式的的单链表是链式存储结构。 例如: 2.【基本操作设计】 ①public booleaninsertBack(double c,int e) 给存储多项式的单链表的尾部插入一个结点 ②给存储多项式的单链表中插入一个结点 新结点 3.【算法设计】 流程图:

算法描述:构造两个链表类s1,s2,头指针分别为ah,bh,从第一个结点开始比较: (1)如果两个结点的多项式阶数相等,那么把两个系数相加,指数不变赋给s1的第一个结点,指针后移; (2)如果s1的结点阶数小于s2的结点阶数,s1的指针ah后移,判断下一个结点阶数与s2当前阶数大小; (3)如果s1的结点阶数大于s2,那么将s2的当前结点插入s1当前结点的前面。直到s1或s2的指针指向空。 判断s1或者s2指针是否指到末尾: ①若s2指针指空,那么结束程序。 ②若s1指针指空,则把s1 的末尾指针指向s2剩余的部分。 4.【高级语言代码】 多项式加法:自身多项式和ob相加,和为自身 public void addPoly(linkListob) { link ah=first; //自身的第一个结点 link bh=ob.first; //ob的第一个结点 link p,q; //辅助的指针,指向某个结点 //指针ah和bh都没有移到结束处 while(ah!=null&&bh!=null) { if(ah.exp==bh.exp) { //阶数相同 ah.coef+=bh.coef; //改变自身结点系数

相关文档
最新文档