一元多项式程序实验报告

一元多项式程序实验报告
一元多项式程序实验报告

一元多项式程序实验报告

一、需求分析

实现实系数一元多项式的创建,打印以及两个一元多项式的加、减、乘运算。(1)程序所能达到的功能:

a.实现一元多项式的输入;

b. 实现一元多项式的输出;

c. 计算两个一元多项式的和并输出结果;

d. 计算两个一元多项式的差并输出结果;

e. 计算两个一元多项式的积并输出结果。

(2)输入的形式和输入值的范围:

输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0为结束标志,结束一个多项式的输入。

输入形式:

2 3

-1 2

3 0

1 2

0 0

输入值的范围:系数为int型,指数为float型。

(3)输出的形式:

要求:第一行输出多项式1;

第二行输出多项式2;

第三行输出多项式1与多项式2相加的结果多项式;

第四行输出多项式1与多项式2相减的结果多项式;

第五行输出多项式1与多项式2相乘的结果多项式

注:多项式的每一项形如:2.0x^3,注意指数应保留一位小数;

多项式按照升幂次序排列;

系数为1的非零次项应略去系数,系数为0的项不能出现在结果中;

指数为0的项应只输出系数;

多项式的第一项系数符号为正时,不要输出“+”,其他项要输出“+”,“-”符号。

-3.0x^-1-6.0x-2.0x^2-9.0x^3-4.0x^4-6.0x^6

二、概要设计

(1):程序实现

a. 功能:将要进行运算的二项式输入输出;

b. 数据流入:要输入的二项式的系数与指数;

c. 数据流出:合并同类项后的二项式;

d. 程序流程图:二项式输入流程图;

e. 测试要点:输入的二项式是否正确,若输入错误则重新输入。

(2):数据类型

ADT Polynomial{

数据对象:D={ai| ai ∈TermSet,i=1,2,…,m,m≥0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}

数据关系:R1={< ai-1,ai >| ai-1 , ai ∈D,且ai-1 中的指数值<ai 中的指数值,i=2,…,n}

基本操作:sort(Polyn & h); //对多项式进行排序

print(Polyn h); //输出多项式

delZeroCoef(Polyn & h); //判断系数为零的情况

merge(Polyn & h); //合并指数相同的项

createList(); //创建多项式

addPoly(Polyn h1,Polyn h2); //多项式相加

subPoly(Polyn h1,Polyn h2); //多项式相减

multPoly(Polyn h1,Polyn h2); //多项式相乘} ADT Polynomial

三、详细设计

(1):存储结构

一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。

(2):数据链表

由于采用链表的方法,我们可以建立3条链;一条用于存放多项式HA,一条

用于存放多项式HB,还有一条用于存放新形成的HC。此外,我们的程序应具备以下几个功能:建立链表,撤销链表,打印链表,按要求插入一个新的结点,复制链表;为了使上面程序结构分析进一步细化,为了使程序结构更加清晰,我们可以把上面的内容都编写成函数形式。

1、建立链表

该程序建立链表的函数与大多数建立链表的操作基本一致,但是由于实体是一元多项式的关系。我们更希望,在处理客户输入的数据的同时,能对数据进行适当的处理。也就是数学上所说的,“对一元多项式进行化简,并按照降幂排序。”由于在前面的练习中,我们得知,在链表中插入一个结点的函数,具有对链表的成员进行排序与合并的功能。如此一来,我们可以巧妙地处理,在建立链表的同时,调用”在链表中插入一个结点的函数”,对新建立的链表进行化简。

该函数的算法描述如下;

1)声明指针变量,并作为头指针的指针变量赋初值NULL;

2)创建一个新的结点,并输入链表的信息;

3)若输入的系数值与函数值同不为0时,调用”在链表中插入一个结点的

insert函数”,将结点插入链表中;(注:这里建立链表的函数与以往的不同,

我们是通过假想有一条空链,不断地调用insert函数来实现建立链表的功

能。简言之;链表中成员的链接全都靠insert函数来实现,而该函数仅仅是

不断地提供建立链表所要的数据罢了。)

4)若还要继续插入结点,转到步骤2继续进行;

5)否则,程序结束,把头指针返回主程序。

2、撤销链表

撤销链表是为了把链表所占用的地址回收起来,防止造成浪费。我们该程序可以采用从链表的始端逐步销去结点。在这个过程中,我们需要链表的头地址作为形式参数,还需要建立一个指针用来指向新头地址。

该函数的算法描述如下:

1)指针变量;并把头地址指针赋给新指针变量;

2)把头地址指针指向下一个结点;

3)删除新指针变量;

4)若还要继续删除结点,转到步骤1继续执行;

5)否则,结束程序。

3、打印链表

为了直观地了解链表的内容,我们设计出依次输出链表结点的函数。由于该题目对链表的输出格式又有了一定的要求,因此该函数设计也有着不一样的地方。依题意得;首先输出系数,系数后面紧跟着一个符号”X”;再输出指数,指数的前面带有符号”^”;

而且相邻的结点都要用”+”或”-”链接起来,因此我们还要对系数的正负进行判断(由于头地址比较特殊,所以头地址除外)。系数为正,要输出符号”+”;系数为负时,编译时会自动加入符号”-”,所以不必再输出符号”-”。

该函数的算法描述如下:

1)建立一个新的指针变量,并把头指针赋给它;

2)如果为空,则打印出”全空”的语句;

3)由于该程序没有删除结点的函数,所以碰到系数为”0”时,我们直接跳到

步骤7;

4)否则,先以”系数X ^指数”的形式输出头结点的成员;

5)若还要继续输出结点,就判断系数的正负;

1,若系数为正,以”+ 系数X ^指数”的形式输出;

2,若系数为负,以”系数X ^指数”的形式输出;

6)把新指针指向下一个结点;

7)若还要继续输出结点,转到步骤3继续执行;

8)否则,结束程序。

4、按要求插入一个新的结点

由于前面的建立链表的creat函数,调用了该函数,所以我们这个函数的设计思想也明朗多了,由于建立的链表是有序的,并且需要合并指数相同的结点,所以要新结点需要按指数值降幂的顺序插入链表中。判断链表是否为空,如果为空则直接插入即可;否则按照要插入结点指数值的大小在链表中寻找他要插入的位置,对于插入位置有第一个节点、最后一个结点和链表中间这三种情况分别进行处理。

函数的形式参数:链表的头地址,指向要插入结点的指针;

返回结果:插入结点后新链表的头地址。

该函数的算法描述如下:

1)声明指针变量并令它指向连头结点;

2)判断指向要插入结点的指针是否为空;

3)如果是,则不需要插入新结点,直接返回头地址,程序结束;

4)否则再判断链表是否为空;

5)如果是,则直接插入结点,然后返回链表的头地址,程序结束;

6)否则,在链表中寻找待插入结点的插入位置:

1,若链表中存在着与“插入的结点”的指数相同的情况,我们依然插入链中,只是把该结点的系数修改为”0”,把链中的结点系数修改为”两系

数之和”。(为了方便,我们并没有把结点进行删除的操作,只是在输出

的操作里加入权限设置。)

2,若链表中不存在着与“插入的结点”的指数相同的情况,我们正常地插入链中。

7)返回插入结点后链表的头地址,程序结束。

5、主函数

主函数主要负责输出界面的指引语句,并合理地调用各个函数,还要有适当的循环操作以及停止循环的语句,以致可以方便地达到合并两个一元多项式的功能。(3):函数的调用关系:

四、调试分析

(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析:

在输入诸如“0,3”,“2,0”时,程序无法正常运行或总是出错.

解决:对指数或系数为0的情况应单独讨论。为此,建立了delZeroCoef函数来解决问题。

(2)算法的时间复杂度及改进

算法的时间复杂度:一元多项式的加法运算的时间复杂度为O(m+n),减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。

问题和改进思想:在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算。

五、总结与分析

一元多项式的表示与其运算设计,运行结果能表达多项式,包括其系数及指数,也实现了多项式的相加、相减以及相乘,运行结果符合一元多项式的在实际运用中的运算法则。使用该程序能快捷方便计算出多个复杂的一元多项式的计算,体现了本设计的可行性以及实用性。

集合的表示与运算设计,运行结构能表达出输入的集合元素并以集合形式输出,也实现了集合的相并、相交、求差集,运行结果符合集合运算法则,操作简单方便,体现了本设计的可行性以及实用性。

两个设计具有一定共同点,均运用了数据结构中线性结构的内容。一元多项式构造链表存放数据与集合构造链表存放集合元素原理相仿,而两者均运用到switch 语句实现运算操作,由于两者要求的运算操作较多,使用switch语句实行多分支选择则可简化程序,同时使程序显得精辟。

设计期间,翻阅资料让我对数据结构有了重新的认识,比如说能区分出C语言以及C++语言,操作时,常常会出现程序无误确无法运行,这就是程序中含有C语

言又含有C++,语句无误但是程序是不正确的。有时候是因为没有调用好语句。而设计中另外的收获就是可以趁着上机的机会巩固数据结构的知识,尤其是线性表一章的内容。要想学好数据结构以及课程设计,多操作是难免的,熟悉掌握各种类型的设计思路。刚开始要从基础程序入手,以课本上的例题为准,反复练习打好基础,再找一些课外的资料,以帮助开拓思路,提高自己的分析、解决能力,掌握一般的规律。今后的学习也要继续这样的学习态度,不断钻研,力争上游,为将来的大设计、大项目打下扎实的基础。

五、源程序代码

#include

#include

#include

typedef struct LNode {

float coef;

int expn;

struct LNode *next;

}LNode;

LNode* InitPolyn(LNode *La,int n) {

if(n <= 0) return NULL;

LNode *h = La = (LNode*)malloc(sizeof(LNode)), *Lb;

La->coef = 0.0;

int i;

printf("依次输入%d个非零项(每项前一个为系数,后一个为指数)\n",n);

for (i = 1; i <= n; ++i) {

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

if(La->coef)

Lb = La;

La = La->next = (LNode*)malloc(sizeof(LNode));

}

Lb->next = NULL;

free(La);

return h;

}

LNode* selsort(LNode *h) {

LNode *g, *La, *Lb;

if(!h) return NULL;

float f;

int i, fini = 1;

for(g = h;g->next&&fini;g = g->next) {

fini = 0;

for(La = h,Lb = h->next;Lb;La = La->next,Lb = Lb->next) if (La->expn < Lb->expn) {

f = La->coef;i = La->expn;

La->coef = Lb->coef;La->expn = Lb->expn;

Lb->coef = f;Lb->expn = i;

fini = 1;

}

}

for(g = h,La = g->next;La;)

if(g->expn==La->expn) {

g->coef += La->coef;

g->next = La->next;

Lb = La;

La = La->next;

free(Lb);

}

else if(g->next) {

g = g->next;

La = La->next;

}

return h;

}

void PrintfPoly(LNode *La) {

LNode *Lb = La;

if(!Lb) {

putchar('0');

return;

}

if(Lb->coef!=1) {

printf("%g",Lb->coef);

if(Lb->expn==1) putchar('X');

else if(Lb->expn) printf("X^%d",Lb->expn); }

else if(!Lb->expn) putchar('1');

else if(Lb->expn==1) putchar('X');

else printf("X^%d",Lb->expn);

Lb = Lb->next;

while (Lb) {

if(Lb->coef > 0) putchar('+');

if(Lb->coef!=1) {

printf("%g",Lb->coef);

if(Lb->expn==1) putchar('X');

else if(Lb->expn) printf("X^%d",Lb->expn); }

else if(!Lb->expn) putchar('1');

else if(Lb->expn==1) putchar('X');

else printf("X^%d",Lb->expn);

Lb = Lb->next;

}

}

Compare(LNode *a, LNode *b) {

if (a->expn < b->expn) return -1;

if (a->expn > b->expn) return 1;

return 0;

}

LNode* AddPolyn(LNode *Pa, LNode *Pb) { LNode *h, *qa = Pa, *qb = Pb, *La, *Lb; float sum;

h = La = (LNode*)malloc(sizeof(LNode)); La->next = NULL;

while (qa && qb) {

switch (Compare(qa,qb)) {

case -1:

La->next = qb;

La = qb;

qb = qb->next;

break;

case 0:

sum = qa->coef + qb->coef;

if (sum != 0.0) {

La->next = qa;

qa->coef = sum;

La = qa;

qa = qa->next;

}

else {

Lb = qa;

qa = qa->next;

free(Lb);

}

Lb = qb;

qb = qb->next;

free(Lb);

break;

case 1:

La->next = qa;

La = qa;

qa = qa->next;

break;

}

}

if (Pa) La->next = qa;

if (Pb) La->next = qb;

Lb = h;

h = h->next;

free(Lb);

return h;

}

LNode* Add(LNode *Pa, LNode *Pb) {

int n;

puts("再输入1个一元多项式的项数");

scanf("%d",&n);

Pb = InitPolyn(Pb,n);

Pb = selsort(Pb);

PrintfPoly(Pa);

if(Pb && Pb->coef>0) printf(" + ");

PrintfPoly(Pb);

Pa = AddPolyn(Pa,Pb);

printf(" = ");

Pa = selsort(Pa);

PrintfPoly(Pa);

return Pa;

}

LNode* SubtractPolyn(LNode *Pa, LNode *Pb) { LNode *La = Pb;

while(La) {

La->coef *= -1;

La = La->next;

}

return AddPolyn(Pa,Pb);

}

LNode* Subtract(LNode *Pa, LNode *Pb) {

int n;

puts("\n再输入1个一元多项式的项数"); scanf("%d",&n);

Pb = InitPolyn(Pb,n);

Pb = selsort(Pb);

PrintfPoly(Pa);

printf(" - ");

putchar('(');PrintfPoly(Pb);putchar(')');

Pa = SubtractPolyn(Pa,Pb);

printf(" = ");

Pa = selsort(Pa);

PrintfPoly(Pa);

return Pa;

}

LNode* MultiplyPolyn(LNode *Pa, LNode *Pb) { if(!Pb) return NULL;

LNode *pa = Pa, *p, *q, *r, *s, *t;

r = p = (LNode*)malloc(sizeof(LNode));

while(pa) {

p->coef = pa->coef;

p->expn = pa->expn;

q = p;

p = p->next = (LNode*)malloc(sizeof(LNode)); pa = pa->next;

}

q->next = NULL;

pa = Pa;

t = s = (LNode*)malloc(sizeof(LNode)); while(pa) {

q = s;

s = s->next = (LNode*)malloc(sizeof(LNode)); pa = pa->next;

}

q->next = NULL;

free(s);

pa = Pa;

while(pa) {

pa->coef *= Pb->coef;

pa->expn += Pb->expn;

pa = pa->next;

}

Pb = Pb->next;

while(Pb) {

p = r;

s = t;

while(p) {

s->coef = p->coef * Pb->coef;

s->expn = p->expn + Pb->expn;

p = p->next;

s = s->next;

}

Pa = AddPolyn(Pa,t);

Pb = Pb->next;

}

return Pa;

}

LNode* Multiply(LNode *Pa, LNode *Pb) {

puts("\n再输入1个一元多项式的项数");

scanf("%d",&n);

Pb = InitPolyn(Pb,n);

Pb = selsort(Pb);

putchar('(');PrintfPoly(Pa);putchar(')');

printf("×");

putchar('(');PrintfPoly(Pb);putchar(')');

printf(" = ");

Pa = MultiplyPolyn(Pa,Pb);

Pa = selsort(Pa);

PrintfPoly(Pa);

return Pa;

}

void main() {

LNode *A,*B;

char s[2];

int i,n;

printf("\t\t\t------------------------------\n");

printf("\t\t\t 一元多项式的表达与运算\n "); printf("\t\t\t------------------------------\n");

printf("\t\t\t ****Made by Huangruiting****\n"); puts("\n输入1个一元多项式的项数");

scanf("%d",&n);

A = InitPolyn(A,n);

A = selsort(A);

PrintfPoly(A);

p: puts("\n1:加\n2:减\n3:乘\n4:退出");

getchar();

q: gets(s);

if(s[1]!='\0' || !isdigit(*s)) {

puts("Error,请重新输入!");goto q;

}

i = *s-48;

switch(i) {

case 1:A = Add(A,B);goto p;;

case 2:A = Subtract(A,B);goto p;;

case 3:A = Multiply(A,B);goto p;

case 4:break;

default:puts("Error,请重新输入!");goto q;

}

}

七、程序运行说明与结果

例:x2 +3x

(1)按照需要操作的多项式输入第1个多项式的项数

例中多项式项数为2,输入2,回车;

(2)依次输入两个非零项,两个项之间用空格间开即可,每项输入,前一个为系数,后一个为指数,例中多项式第一项系数为1,输入1,空格,指数为2,输入2,空格,第二项系数为3,输入3,空格,指数为1,输入1,回车;

即显示x^2+3x

(x^2表示x的2次方)。

例:计算x2 +3x 与x3 +2x4 的乘积

(3)选择需要操作的运算,例如要计算多项式乘多项式,选择3,回车;(4)再按照步骤(2)输入多项式x3 +2x4 ,回车;

(5)输出(x^2+3x)×(3x^2) = 3x^4+9x^3 (得出结果为3x4+9x3)

数据结构实验报告,一元多项式资料

数据结构课程设计报告

目录 一、任务目标,,,,,,,,,,,, 3 二、概要设计,,,,,,,,,,,, 4 三、详细设计,,,,,,,,,,,, 6 四、调试分析,,,,,,,,,,,, 8 五、源程序代码,,,,,,,,,, 8 六、程序运行效果图与说明,,,,, 15 七、本次实验小结,,,,,,,,, 16 八、参考文献,,,,,,,,,,, 16

任务目标 分析(1) a. 能够按照指数降序排列建立并输出多项式 b.能够完成两个多项式的相加,相减,并将结果输入要求:程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果;除任务要求外新增乘法: 计算两个一元多项式的乘积并输出结果 (2)输入的形式和输入值的范围:输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0 为结束标志,结束一个多项式的输入。 输入形式: 2 3 -1 2 3 0 1 2 0 0 输入值的范围:系数为int 型,指数为float 型 3)输出的形式: 第一行输出多项式1; 第二行输出多项式2; 第三行输出多项式 1 与多项式 2 相加的结果多项式; 第四行输出多项式 1 与多项式 2 相减的结果多项式;第五行输出多项式 1 与多项式 2 相乘的结果多项式 二、概要设计 程序实现 a. 功能:将要进行运算的二项式输入输出;

b. 数据流入:要输入的二项式的系数与指数; c.数据流出:合并同类项后的二项式; d.程序流程图:二项式输入流程图; e.测试要点:输入的二项式是否正确,若输入错误则重新输入

数据结构实验多项式加法

数据结构实验报告 实验名称:多项式加减法 学号: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{

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

插值法实验报告

实验二插值法 1、实验目的: 1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。 2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。 2、实验要求: 1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法; 2)编写上机实验程序,作好上机前的准备工作; 3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果); 4)分析和解释计算结果; 5)按照要求书写实验报告; 3、实验内容: 1) 用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。 已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。 2) 求满足插值条件的插值多项式及余项 1) 4、题目:插值法 5、原理: 拉格郎日插值原理: n次拉格朗日插值多项式为:L n (x)=y l (x)+y 1 l 1 (x)+y 2 l 2 (x)+…+y n l n (x)

n=1时,称为线性插值, L 1(x)=y (x-x 1 )/(x -x 1 )+y 1 (x-x )/(x 1 -x )=y +(y 1 -x )(x-x )/(x 1 -x ) n=2时,称为二次插值或抛物线插值, L 2(x)=y (x-x 1 )(x-x 2 )/(x -x 1 )/(x -x 2 )+y 1 (x-x )(x-x 2 )/(x 1 -x )/(x 1 -x 2 )+y 2 (x -x 0)(x-x 1 )/(x 2 -x )/(x 2 -x 1 ) n=i时, Li= (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) 6、设计思想: 拉格朗日插值法是根据n + 1个点x0, x1, ... x n(x0 < x1 < ... x n)的函数值f (x0), f (x1) , ... , f (x n)推出n次多項式p(x),然后n次多項式p (x)求出任意的点x对应的函数值f (x)的算法。 7、对应程序: 1 ) 三次拉格朗日插值多项式求x=0.5635时函数近似值 #include"stdio.h" #define n 5 void main() { int i,j; float x[n],y[n]; float x1; float a=1; float b=1; float lx=0; printf("\n请输入想要求解的X:\n x="); scanf("%f",&x1); printf("请输入所有点的横纵坐标:\n"); for(i=1;i

数据结构 多项式 实验报告

数据结构实验报告 实验名称:实验一——多项式的实现 学生姓名: 班级: 班内序号: 学号: 日期:2011年10月29日 1.实验要求 实验目的: 1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 2.学习指针、模板类、异常处理的使用 3.掌握线性表的操作的实现方法 4.学习使用线性表解决实际问题的能力 实验内容: 利用线性表实现一个一元多项式Polynomial f(x) = a0 + a1x + a2x2 + a3x3+ … + a n x n 要求: 1.能够实现一元多项式的输入和输出 2.能够进行一元多项式相加 3.能够进行一元多项式相减 4.能够计算一元多项式在x处的值 5.能够计算一元多项式的导数(选作) 6.能够进行一元多项式相乘(选作) 7.编写测试main()函数测试线性表的正确性 2. 程序分析 由于多项式是线性结构,故选择线性表来实现,在这个程序中我采用的是单链表结构,每个结点代表一个项,多项式的每一项可以用其系数和指数唯一的表示。如果采用顺序存储,那么对于结点的插入和删除的操作会比较麻烦,而且顺序表的结点个数固定,对于可能发生的情况无法很好的处理,而采用链表就会简单许多,还能自由控制链表的长度。 两个多项式要进行多次的计算,为了保护原始的数据,方便进行以后的计算,故选择把结果存储在一个新建的链表里。 本程序完成的主要功能: 1.输入和输出:需要输入的信息有多项式的项数,用来向系统动态申请内存;多项式

各项的系数和指数,用来构造每个结点,形成链表。输出即是将多项式的内容 向屏幕输出。 2.多项式相加与相减:多项式的加减要指数相同即是同类项才能实现,所以在运算时 要注意判断指数出现的各种不同的情况,分别写出计算方法。将每项运算得到 的结果都插入到新的链表中,形成结果多项式。 3.多项式的求导运算:多项式的求导根据数学知识,就是将每项的系数乘以指数,将 指数减1即可,将每项得到的结果插入到结果多项式的链表中。 4.多项式在某点的值:由用户输入x的值,然后求出每项的值相加即可。 2.1 存储结构 本程序采用的存储结构是单链表结构,其定义的结点包括三部分:系数、指数以及下一个结点的地址。示意图如下: 1.输入多项式 ·自然语言描述: 1.设置多项式的项数n; 2.按照多项式的项数申请动态数组coef[]和expn[]存储多项式的系数和指数; 3.按照指数递增的次序输入各项的系数以及指数,分别存入coef和expn; 4.再将输入的系数以及指数赋给每一个结点的coef和expn域; 5.利用头插法将每个结点加入链表。 ·伪代码: 1.输入项数n; 2.float* coef1=new float[n1]; int* expn1=new int[n1]; 3.运用for循环,循环n次 3.1 term* s=new term; 3.2 s->coef=coef[i]; 3.3 s->expn=expn[i]; 3.4 r->next=s; 3.5 r=s; 4. 运用头插法将结点插入链表。 时间复杂度: 空间复杂度: 2.输出多项式 ·自然语言描述: 1.获取头结点; 2.循环n-1次(n为多项式的项数) 2.1将指针的指向后移; 2.2依照多项式的各种情况,设置输出方式 2.2.1 系数为1且指数不为1和0,输出x^expn+; 2.2.2 系数不为0且指数为0,输出(coef)+; 2.2.3 系数不为0且指数为1,输出(coef)x+;

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

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间: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)

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

数据结构实验报告实验一:一元多项式相加 姓名:周成 学号: 专业:软件工程 任课教师:马慧珠 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 {

一元多项式相加完整实验报告

一元多项式相加实验报告 一元多项式的相加

一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 term, ElemType; V oid AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b) Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构

一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 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 实验目的 本实验使用多项式模型对数据进行拟合,目的在于: (1)掌握数据拟合的基本原理,学会使用数学的方法来判定数据拟合的情况; (2)掌握最小二乘法的基本原理及计算方法; (3)熟悉使用matlab 进行算法的实现。 2 实验步骤 2.1 算法原理 所谓拟合是指寻找一条平滑的曲线,最不失真地去表现测量数据。反过来说,对测量 的实验数据,要对其进行公式化处理,用计算方法构造函数来近似表达数据的函数关系。由于函数构造方法的不同,有许多的逼近方法,工程中常用最小平方逼近(最小二乘法理论)来实现曲线的拟合。 最小二乘拟合利用已知的数据得出一条直线或曲线,使之在坐标系上与已知数据之间的距离的平方和最小。模型主要有:1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型等,根据应用情况,选用不同的拟合模型。其中多项式型拟合模型应用比较广泛。 给定一组测量数据()i i y x ,,其中m i ,,3,2,1,0Λ=,共m+1个数据点,取多项式P (x ),使得 min )]([020 2=-=∑∑==m i i i m i i y x p r ,则称函数P (x )为拟合函数或最小二乘解,此时,令 ∑==n k k k n x a x p 0 )(,使得min ])([02 002=??? ? ??-=-=∑∑∑===m i n k i k i k m i i i n y x a y x p I ,其中 n a a a a ,,,,210Λ为待求的未知数,n 为多项式的最高次幂,由此该问题化为求),,,(210n a a a a I I Λ=的极值问题。 由多元函数求极值的必要条件:0)(200 =-=??∑∑==m i j i n k i k i k i x y x a a I ,其中n j ,,2,1,0Λ= 得到: ∑∑∑===+=n k m i i j i k m i k j i y x a x )(,其中n j ,,2,1,0Λ=,这是一个关于n a a a a ,,,,210Λ的线 性方程组,用矩阵表示如下所示:

实验四 数据分析与多项式计算(含实验报告)

实验四 数据分析与多项式计算 一、实验目的 1.掌握数据统计和分析的方法。 2.掌握数据插值与曲线拟合的方法及其应用。 3.掌握多项式的常用运算。 二、实验的设备及条件 计算机一台(带有MATLAB7.0以上的软件环境)。 设计提示 1.参考本节主要内容,学习并理解相关函数的含义及调用方法。 三、实验内容 1.请完成教材P134中实验指导环节的实验内容的第1题; 2. 请完成教材P134中实验指导环节的实验内容的第2题(此题含两个小题, 任选其一完成); 3. 请完成教材135中实验指导环节的实验内容第4题; 4. 请完成教材135中实验指导环节的实验内容的第5题。 5. 已知某压力传感器的测试数据如下表 p 0.0 1.1 2.1 2.8 4.2 5.0 6.1 6.9 8.1 9.0 9.9 u 10 11 13 14 17 18 22 24 29 34 39 p 为压力值,u 为电压值,试用多项式 d cp bp ap p u +++=23)(来拟合其特性函数,求出a,b,c,d ,并把拟合曲线和各个测试数据点画在同一幅图上。 四、实验报告要求(包含预习报告要求和最终报告要求) 1.实验名称 2.实验目的 3.实验设备及条件 4.实验内容及要求 5.实验程序设计 指程序代码。 预习报告 要求 最终报告要求

6.实验结果及结果分析 实验结果要求必须客观,有数据的可以记录数据,没有数据的简单描述实验现象。结果分析是对实验结果的理论评判。 7.实验中出现的问题及解决方法 8. 思考题的回答 一、实验报告的提交方式 Word文档,命名方式:实验号_你的学号_姓名!!! 例如本次实验:实验一_000000001_张三.doc (信息101提交报告邮箱):E_mail: matlab_xx01@https://www.360docs.net/doc/ee13806770.html, (网络工程101提交作业邮箱):E_mail: Matlab_wg01@https://www.360docs.net/doc/ee13806770.html,(注意网络班的M是大写的) 下一次课前提交,过期不收! 二、参考文献 参考教材和Matlab帮助文件。 1.实验名称 数据分析与多项式计算 2.实验目的 1.掌握数据统计和分析的方法。 2.掌握数据插值与曲线拟合的方法及其应用。 3.掌握多项式的常用运算。 3.实验设备及条件 计算机一台(带有MATLAB7.0以上的软件环境) 4.实验内容及要求 完成所给实验题以及思考题,题与题之间用相应注释分割。注意对实验中出现的相关函数或变量,请使用help或doc查询相关帮助文档,学习函数的用法。 5.实验程序设计 %1.1

两个一元多项式相加-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

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告一元多项式的相加 一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 oat flcoef; // 系数 int expn; // 指数 term, ElemType; Void AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b)

Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构 一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 序数coef 指数exp 指针域next 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 开始 申请结点空间 输入多项式各项的系数X,指数Y 输出已输出的多项式 否 是否输入正确 合并同类项 结束 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相

数据结构实验报告-一元多项式

数据结构课程设计报告 课题: 一元多项式 姓名: XX 学号: 201417030218 专业班级: XXXX 指导教师: XXXX 设计时间: 2015年12月30日星期三

目录 一、任务目标 (3) 二、概要设计 (4) 三、详细设计 (6) 四、调试分析 (8) 五、源程序代码 (8) 六、程序运行效果图与说明 (15) 七、本次实验小结 (16) 八、参考文献 (16)

一丶任务目标 分析 (1) a.能够按照指数降序排列建立并输出多项式 b.能够完成两个多项式的相加,相减,并将结果输入 要求:程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果; 除任务要求外新增乘法: 计算两个一元多项式的乘积并输出结果 (2)输入的形式和输入值的范围: 输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0为结束标志,结束一个多项式的输入。 输入形式: 2 3 -1 2 3 0 1 2 0 0 输入值的范围:系数为int型,指数为float型 (3)输出的形式: 第一行输出多项式1; 第二行输出多项式2; 第三行输出多项式1与多项式2相加的结果多项式; 第四行输出多项式1与多项式2相减的结果多项式; 第五行输出多项式1与多项式2相乘的结果多项式

二、概要设计 程序实现 a. 功能:将要进行运算的二项式输入输出; b. 数据流入:要输入的二项式的系数与指数; c. 数据流出:合并同类项后的二项式; d. 程序流程图:二项式输入流程图; e. 测试要点:输入的二项式是否正确,若输入错误则重新输入。

一元多项式计算器程序设计实验报告

武汉工业学院 数学与计算机学院 《数据结构》 课程设计说明书 题目:一元多项式计算器 专业:计算机 班级:计算机类1305班 学号: 1305110053 姓名:杨钦 指导老师:左翠华 2014年12月25日

一、 设计题目 一元稀疏多项式计算器 【问题描述】 设计一个一元稀疏多项式简单计算器。 【基本要求】 一元稀疏多项式简单计算器的基本功能是: (1) 输入并建立多项式 ; (2) 输出多项式,输出形式为整数序列:n ,c l ,e l ,c 2,e 2,…,c n ,e n ,其中n 是多项式的项数,c i 和e i ,分别是第 i 项的系数和指数,序列按指数降序排列; (3) 多项式a 和b 相加,建立多项式a +b ; (4) 多项式a 和b 相减,建立多项式a -b 。 【测试数据】 (1)(2x+5x 8-3.1x 11) + (7-5x 8+11x 9)=(-3.lx 11+11x 9+2x+7) (2)(6x -3-x+4.4x 2-1.2x 9) -(-6x -3+5.4x 2-x 2+7.8x 15)=(-7.8x 15-1.2x 9+12x -3-x) (3)(1 +x + x 2+x 3+x 4+x 5)+(-x 3-x 4)=(1+x+x 2+x 5) (4)(x+x 3)+(-x -x 3)=0 (5)(x+x 100)+(x 100 +x 200)=(x+2x 100+x 200) (6)(x+x 2+x 3)+0=x+x 2+x 3 (7) 互换上述测试数据中的前后两个多项式 【实现提示】 用带表头结点的单链表存储多项式。 【选作内容】 (1) 计算多项式在x 处的值。 (2) 求多项式 a 的导函数a ' 。 (3) 多项式a 和b 相乘,建立乘积多项式ab 。 (4) 多项式的输出形式为类数学表达式。例如,多项式 -3x8+6x3-18 的输出形式为183683-+-∧∧x x ,x15+(-8)x7-14的输出形式为147815--∧∧x x 。注意,数值为1的非零次项的输出形式中略去系数1,如项1x8的输出形式为x8,项 -1x3的输出形式为-x3。

数据结构多项式实验报告

数据结构实验报告--Week05 姓名:覃兆坤学号:10389355 一、实验目的 用线性表实现多项式的相关操作,加强对线性表的理解和练习,熟练对线性表的操作。 二、实验题目 一个d阶多项式有如下形式:c d x d+c d?1x d?1+c d?2x d?2…+c0 其中,c d≠0,指数都是非负数。每一个c i x i是多项式中的一项。 设计一个C++的模板类Polynomial,T给出系数的类型,要求能够实现多项式的表示和运算。Polynomial类应该包括私有变量degree,和其他需要的变量。对多项式的表示要求用线性表的形式,例如(c0,c1,c2,…,c d)表示系数表。并设计以下成员函数和操作: (a) Polynomial(),创建零阶多项式,即构造函数 (b) Degree(),返回多项式的阶数degree (c) Input(),输入多项式,指数升序依次输入每一项的指数和系数。例如输入: 0 c0 1 c1 2 c2…d c d。重载>>完成输入。 (d) Output(),输出多项式,和输入的格式相同。重载<<完成输出。 (e) Add(b),和b多项式相加,并返回结果多项式。重载+。 (f) Subtract(b),和b多项式相减返回结果多项式。重载-。 (g) Multiply(b),和b多项式相乘返回结果多项式。重载*。 (h) Value(x),返回x代入多项式的值。重载( ),例如对于多项式对象P, P(x)能够返回代入x的多项式值。 三、实验设计 设计方法: 本次实现采用链表的结构,实现建立多项式,对多项式进行相加相减相乘求值的操作。 一共写了2个文件Polynomial.h和test.cpp文件。其中前者实现多项式的相关功能,后者为人机交互式测试其功能。 1:Polynomial.h:共有2个类: Node为一个节点其中index; modulus; next 分别为指数,系数和 指向下一个节点的指针。 Polynomial为一个多项式,私有成员有degree为多项式阶数, head为表头指针。公有函数:

稀疏一元多项式运算器 实验报告 附源程序

信息学院12级杨征元 PB 稀疏一元多项式运算器 问题描述:完成一元稀疏多项式运算器,完成多项式创建,显示,复制,求和,求差,求值,销毁,清空,修改,n阶微分,不定积分,定积分操作。函数功能描述如下: 稀疏一元多项式运算器 0.退出退出 1.创建多项式创建并打印 2.显示多项式打印 3.复制多项式复制多项式a至空域b,非空报错 4.求和输入abc位置,c=a+b 5.求差输入abc位置,c=a-b 6.求值输入位置,double x,输出double result 7.销毁多项式销毁,使p[i]为NULL 8.清空多项式清空保留头指针,输出为0 9.修改多项式选择插入,删除,修改(删了再插) 阶微分输入微分位置,阶数,结果存放于原位置 11.不定微分输入积分位置,不定积分,常数C取0 12.定微分输入积分位置,上下限值,输出定积分结果 算法描述:通过主菜单调用函数完成各项功能,函数描述见程序结构描述部分。 数据结构描述:多项式每一项结点定义如下: typedef struct lnode{ double coef; int exp; struct lnode* next; }lnode,*linklist; 包含指向下一结点指针linklist next,存储系数的数据单元double coef,存储指数的数据单元int exp;结点名lnode,指向结点指针linklist。 每一个多项式由头指针引出,头指针数组lnode* p[N]。每一个单元存储一多项式头指针。当多项式不存在,p[i]=NULL;多项式为空,p[i]->next=NULL,即只存在头指针。 操作函数见程序结构描述部分。 程序结构描述: 函数包括创建结点函数,有序插入函数,打印函数,创建多项式函数,多项式清空函数,多项式销毁函数,求值函数,求和函数,求差函数,复制函数,删除结点函数,修改函数,n 阶微分函数,不定积分函数。对函数原型,功能,借口逐一描述如下: 1.创建结点函数 函数原型:linklist makenode(double coef, int exp) 输入double型系数项,int型指数项,创建lnode结点,返回指向结点的linklist指针。 功能:创建新结点,在复制函数以及输入系数指数插入结点时(修改多项式) 调用。 2.有序插入函数 函数原型:void insert(linklist phead, linklist head) 输入插入结点指针phead以及多项式头指针head,无返回值 功能:新结点phead有序插入头结点为head的多项式内(按指数项降序排列),在创建,

数据结构多项式相加实验报告

试验一多项式相加 一. 实验内容: 多项式相加 二.实验目的和要求: 利用双向链表实现通讯录的建立、删除、检索和列表,并可保存至文件,可重新装入。 用链式存储结构实现一元多项式的相加运算。 三.算法思想描述: 1. 以单链表为存储结构插入多项式: 多项式输入:多项式按幂从高到低,以“系数,幂”的格式输入,并以“0,0”结束。 printf("Please input coef:"); scanf("%d",&i); printf("Please input exp: "); scanf("%d",&j); while(i!=0) { q=(pnode)malloc(sizeof(struct node)); q->coef=i; q->exp=j; p->link=q; p=q; printf("Please input coef:"); scanf("%d",&i); printf("Please input exp: "); scanf("%d",&j); } p->link=NULL; 2. 多项式相加单链表合并: 由两个多项式对应的单链表头节点开始,依次扫描各节点。 (1)若两表的节点均非空:比较二者的幂,按幂大者先入表。如果幂相等,则系数相加再入表。具体由以下代码实现: while(p!=NULL && q!=NULL){ if(p->exp==q->exp){ x=p->coef+q->coef; if(x!=0){ s=(pnode)malloc(sizeof(struct node)); s->coef=x;s->exp=p->exp;

r->link=s; r=s; } p=p->link; q=q->link; } else if(p->expexp){ s=(pnode)malloc(sizeof(struct node)); s->coef=q->coef; s->exp=q->exp; r->link=s;r=s; q=q->link; } else{ s=(pnode)malloc(sizeof(struct node)); s->coef=p->coef; s->exp=p->exp; r->link=s;r=s; p=p->link; } (2). 若有一链表已空,则将非空链表插入新表: while(p!=NULL){ s=(pnode)malloc(sizeof(struct node)); s->coef=p->coef; s->exp=p->exp; r->link=s; r=s; p=p->link; } while(q!=NULL){ s=(pnode)malloc(sizeof(struct node)); s->coef=q->coef; s->exp=q->exp; r->link=s; r=s; q=q->link; } 3. 输出合并后的链表: while(head->link!=NULL) { head=head->link; printf(" %d*x^%d",head->coef,head->exp);

相关文档
最新文档