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

一.实验目的:理解线性表的基本逻辑结构,完成链表及循环链表的实现通过实验进一步理解线性表的逻辑结构和存储结构,提高使用理论知识指导解决实际问题的能力,熟练掌握链表的实际应用。
二.实验内容:题目:一元多项式运算问题描述:设计算法实现一元多项式的简单运算。
基本要求:(1)输入并建立多项式;(2)输出多项式;(3)多项式加法(4)多项式减法。
测试数据:(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)(2)(6x-3-x+4.4x2-1.2x9)-(―6x―3-+5.4x2-x2+7.8x15) =(―7.8x15―1.2x9+12x―3―x)(3)(1+x+x2+x3+x4+x5)+(―x3―x4)=(1+x+x2+x5)(4)(x+x3)+(―x―x3)=0(5)(x+x100)+(x100+x200)=(x+2x100+x200)(6)(x+x2+x3)+0=x+x2+x3三. 实验方案(程序设计说明)(一)算法设计思路:1.将两个多项式的系数和指数分别存放在新建的两个链表中;2.其中一个链表A的指针不动,遍历另一个链表B,指数相等时系数相加,删除该数,链表B从头开始,链表A移向下个数据域;3.直到链表B为空或者链表A遍历完成结束。
(二)算法流程图:(三)界面设计说明:请输入多项式的长度: 开始输入多项式长度N 以及系数m,指数nA →n=B →n? YNj++系数相加存放在A 表i++ 结束创建链表A ,B ,链表A 从i=0开始循环,链表B 从j=0开始i>N?NYi>N?NY请输入第一个多项式的系数、指数:请输入另一个多项式的系数、指数:加法按1,减法按2(四)使用模块及变量的说明实验:m→系数;n→指数;A、B链表四. 实验步骤或程序(经调试后正确的源程序)实验二:(多项式)#include "stdafx.h"#include <iostream>#include "conio.h"using namespace std;typedef struct lnode{int m;//系数int n;//指数struct lnode*next;} LNode, *LinkList;LinkList Creat(LinkList L, int i){LNode *r = NULL, *s;int m, n;for (int j = 0; j<i; j++){scanf_s("%d%d", &m, &n);s = new LNode;s->m = m;s->n = n;if (L == NULL) L = s;else r->next = s;r = s;}if (r != NULL)r->next == NULL;return L;}void Combine(LinkList p, LinkList q, int x, int i, int j) {LinkList s = p, a = q;LNode*pre;pre = s;int k = 0, r = 0;for (; r<i; r++){if (s->n == q->n){switch (x){case 1:q->m += s->m; break;case 2:q->m -= s->m; break;}q = q->next;if (s == p){p = p->next;free(s);s = p;pre = s;}else{pre->next = s->next;delete s;s = p;pre = s;}}else{pre = s;s = s->next;}k++;if (k >= j)s = p;}/*if (r >= i&&p != NULL){p->next = q->next;q->next = p;free(p);p = p->next;}*/for (; i > 0; i--)//while (a->next!=NULL) {cout << a->m << "\t" << a->n << endl;a = a->next;}}int main(){LinkList A = NULL, B = NULL;int x;printf("\n请输入多项式的长度:");scanf_s("%d", &x);printf("\n请输入第一个多项式系数、指数:\n");A = Creat(A, x);printf("\n请输入另一个多项式系数、指数:\n");B = Creat(B, x);int ch;printf("\n加法按1,减法按2\t");scanf_s("%d", &ch);Combine(A, B, ch, x, x);_getch();}五.程序运行结果六.实验总结通过完成此次实验,我对链表有了进一步的理解。
数据结构线性表多项式加减实验报告

数据结构实验报告实验名称:实验一——线性表日期:2013年10月28日1.实验要求实验目的1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2、学习指针、模板类、异常处理的使用3、掌握线性表的操作的实现方法4、学习使用线性表解决实际问题的能力实验内容利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3+ … + a n x nPolynomial的结点结构如下:struct term{float coef; //系数int expn; //指数};要求:1、能够实现一元多项式的输入和输出2、能够进行一元多项式相加3、能够进行一元多项式相减4、能够计算一元多项式在x处的值5、能够计算一元多项式的导数(选作)6、能够进行一元多项式相乘(选作)7、编写测试main()函数测试线性表的正确性2. 程序分析考虑到数据结构的实现,因为多项式是线性结构因此选择线性表,而本次实验中涉及到多项式的加减,要进行节点的添加或者删除,用顺序表显然不能满足要求,而且由于不知道多项式的项数,很容易造成空间的浪费,当两个多项式指数相差很远时,操作要移动很多项,步骤很麻烦繁琐。
综上,我选择了单链表,每个节点有三个部分,分别储存系数、指数、和指针,这样在计算加减或者指数不等时,只需要简单的摘连加链即可,而且不会造成空间的太多浪费。
每次利用尾插法将结点插入基准多项式。
2.1 存储结构本次实验采取的多项式加减算法是将一个多项式作为基准,把另一个多项式加到基准多项式中去,求和后的多项式仍然存储在第一个线性表中,因此用单链表的数据结构更为方便。
单链表存储结构在本次实验中,因为形式的特殊性,每个节点如下图表示:空链表 非空链表其中每个结点前两个分别储存float 型系数coef 和int 型指数expn ,第三个作为指针指向下一个节点(不是最后一个结点时,否则为NUll )2.2 关键算法分析1、输入多项式自然语言描述:1) 指定多项式的项数n2) 建立一个叫term 的struct 结构类型,用来储存指定多项式的系数和指数的数据。
数据结构多项式实验报告

数据结构实验报告--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>,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 分别为指数,系数和指向下一个节点的指针。
数据结构实验╲t多项式加法

实验一:完成多项式的相加运算(验证性、4学时)一、实验目的和要求完成多项式的相加、相乘运算。
(1)掌握线性表的插入、删除、查找等基本操作设计与实现(2)学习利用线性表提供的接口去求解实际问题(3)熟悉线性表的的存储方法二、实验内容和原理1.实验内容设计一个一元多项式的简单计算程序,其基本功能有:(1)输入并建立多项式;(2)输出多项式;(3)多项式的相加运算。
利用单链表实现。
(4) 多项式的相乘运算。
2.实验原理使用单链表实现一元多项式的存储,并实现两个一元多项式的加法运算。
三、实验环境硬件:(1)学生用微机(2)多媒体教室或远程教学(3)局域网环境软件:(1)Windows XP中文操作系统(2)Turbo C 3.0或者VC6.0四、算法描述及实验步骤1、描述对于两个多项式,将它们分别存入两个循环链表中,从两个多项式的链表的第一个元素结点开始检测,对每一个结点做如下操作:(1)若两个多项式中对应结点的指数值相等,则将它们的系数相加。
如果相加结果不为零,则形成一个新结点后链入新链表的末尾。
然后再检测两个链表中的下一个结点。
(2)若两个多项式中对应结点的指数值不相等,则复抄指数值大的那个结点中的指数值与系数值,形成一个新结点后链入(1)中所述的链表尾。
然后再检测指数值小的链表中的当前结点与指数值大的链表中的下一个结点。
上述过程一直做到两个链表中的链表中的所有结点均检测完为止。
2、算法流程图beginscanfNODE *Creat(int n)-1 0 1Y N3、代码(注释)#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define NULL 0 head = (NODE *)malloc(sizeof(NODE)); NODE *AddPolyn(NODE *head1, NODE *head2)qa && qb a = qa->expn; b = qb->expn; ompare(a, b)ha = qa;qa = qa->next; sum = qa->coef + qb->coef; qb = hb->next;ha = ha->next; sum != 0.0 qa->coef = sum; ha = qa; free(Delfirst(ha,qa)) free(Delfirst(hb, qb)) qa = ha->next; qb = hb->next; NODE *Delfirst(NODE *p1, NODE *q) end printftypedef struct NODE{ float coef; //系数int expn; //指数struct NODE *next;}NODE;NODE *Creat(int n);void print(NODE *head);NODE *AddPolyn(NODE *head1, NODE *head2); NODE *Delfirst(NODE *head, NODE *q);void InsertBefore(NODE *p1, NODE *p2);int compare(int a, int b);main(){NODE *head1, *head2, *head3;int n1, n2;printf("请输入你需要的多项数的数目n1 : ");scanf("%d", &n1);head1 = Creat(n1);printf("第一个多项式的显示: \n");print(head1);printf("\n请输入你需要的多项数的数目n2 : ");scanf("%d", &n2);head2 = Creat(n2);printf("\n第二个多项式的显示: \n");print(head2);head3 = AddPolyn(head1, head2);printf("\n合并后的多项式的显示: \n");print(head3);printf("\n");}NODE *Creat(int n) /*创建链表*/{NODE *current, *previous, *head;int i;head = (NODE *)malloc(sizeof(NODE)); /*创建头结点*/ previous = head;for(i = 0; i < n; i++){current = (NODE *)malloc(sizeof(NODE));printf("请输入系数和指数: ");scanf("%f%d", ¤t->coef, ¤t->expn); previous->next = current;previous = current;}previous->next = NULL;return head;}/*一元多项式的想加,总体考虑,可分qa的指数比qb小,或等于pb(如果系数相加等于0和不等于0),或大于pb里面由InsertBefore和Delfirst两个小模块组成一部分*/NODE *AddPolyn(NODE *head1, NODE *head2){NODE *ha, *hb, *qa, *qb;int a, b;float sum;ha = head1; /*ha和hb指向头结点*/hb = head2;qa = ha->next; /*qa和qb指向头结点的下一个结点*/qb = hb->next;while(qa && qb) /*qa和qb均非空*/{a = qa->expn;b = qb->expn;switch(compare(a, b)) {case -1 : /*qa->expn < qb->expn*/ha = qa;qa = qa->next;break;case 0 :sum = qa->coef + qb->coef; /*系数的和*/if(sum != 0.0) /*如果不是0.0*/{qa->coef = sum; /*改变系数*/ha = qa;}else{ free(Delfirst(ha, qa));}free(Delfirst(hb, qb));qa = ha->next;qb = hb->next; /*qb释放后要重新赋值*/break;case 1 : /*如果qa-> expn > qb -> expn*/Delfirst(hb, qb);InsertBefore(ha, qb); /*把qb插入到ha下一个结点之前*/qb = hb->next;ha = ha->next;break;}}if(qb)ha->next = qb; /*插入剩余的pb*/free(head2);return head1;}int compare(int a, int b) /*比较*/{if(a < b)return -1;else if(a > b)return 1;elsereturn 0;}NODE *Delfirst(NODE *p1, NODE *q) /*删除结点q*/{p1 -> next = q -> next;return (q);}/*插入结点,引入结点p,可以让p插入到p2和p1之间*/void InsertBefore(NODE *p1, NODE *p2){NODE *p;p = p1->next;p1->next = p2;p2->next = p;}void print(NODE *head){NODE *current;current = head->next;while(current->next != NULL){printf("%0.f * x^%d + ", current->coef, current->expn);current = current -> next;}printf("%0.f * x^%d", current->coef, current->expn);}五、调试过程#include "alloc.h"语句出错,少了一个m,改为#include "malloc.h",则编译通过了。
数据结构多项式求和实验报告

1.实验题目设计一种用单链表存储多项式的结构(每个结点存储一项的系数和指数,类型都为int),并编写一个产生多项式链表的函数和一个实现两个多项式相加的函数。
2 .实验内容顺序存储结构的实现。
先输入多项式最高项数,然后按照(系数,指数)的格式输入顺序表类型定义如下:typedef struct term{int coef;int expn;struct term *next;}term,*Polynomial;3.实验要求(1)利用C语言完成算法设计和程序设计。
(2)上机调试通过实验程序。
(3)输入数据,检验程序运行结果。
(4)给出具体的算法分析,包括时间复杂度和空间复杂度。
(5)撰写实验报告。
4.实验步骤与源程序⑴实验步骤首先分析实验内容,要实现多项式求和,必须创建两个函数,然后先建立一个多项式a和多项式b,接着输入每个多项式的系数和指数,再实现多项式a和b的求和将求出的多项式放在多项式a中,最后输出求出的多项式的结果。
⑵源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<malloc.h>/*定义存储结构,用单链表存储多项式,链表中每个结点存储多项式中的一项。
*/typedef struct term{int coef;//定义多项式系数为coefint expn;//定义多项式指数为expnstruct term *next;}term,*Polynomial;void Create_Polynomial(Polynomial *P,int n){ /*建立多项式*/int i;term *t1,*t2;(*P)=(term *)malloc(sizeof(term));(*P)->coef=0;(*P)->expn=0;(*P)->next=NULL;t1=(*P);for(i=0;i<=n;i++){ /*输入每一项的系数和指数*/ t2=(term *)malloc(sizeof(term));scanf("%d,%d",&(t2->coef),&(t2->expn));t1->next=t2;t1=t1->next;}t2->next=NULL;}void Add_Polynomial(Polynomial *a,Polynomial *b){ /*多项式a和多项式b求和,结果存放在a中。
数据结构实验报告实验一题目3一元多项式

数据结构实验报告实验名称:实验一题目3 一元多项式学生姓名:许虎班级:信通20班内序号:10学号:78日期:2012年11月2日1.实验要求实验目的:利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3+ … + a n x n并实现相应功能。
实验内容:使用一元多项式类存储多项式元素,通过定义并实现相关函数完成相应的功能,并通过设计的main函数测试了其正确性。
用户可自行输入正确的多项式进行相关运算,得到相应结果。
相关函数实现的功能:1.能够实现一元多项式的输入和输出2.能够进行一元多项式相加3.能够进行一元多项式相减4.能够计算一元多项式在x处的值5.能够计算一元多项式的导数6.能够进行两个一元多项式相乘2. 程序分析2.1 存储结构存储结构:单链表(带头节点)单链表示意图如下:在本程序中使用结构类型element(赋给模版类型T)数组data储存数据成员,包含coef(系数)和exp(指数)两个成员,但仍为一维数组。
在节点构造类型Node(运用了模版类)中定义了指针域next指向下一个结点,直到链表尾将next置空,front头指针为该链表类私有数据成员,如此得到多项式链表(单链表)。
2.2 关键算法分析1、关键算法:1)一元多项式类求和函数(1)初始化工作指针p_prior(指向A链表头结点),p(p->next),q(指向B链表第一个结点)。
(2)若p和q都不为空,则循环下列操作:(3)若p->data.exp<q->data.exp,则p_prior=p;p=p->next。
(4)否则,若p->data.exp>q->data.exp,则:将q结点加入到A链表p结点之前,q指向B链表下移个结点。
(5)否则,p->data.coef=p->data.coef+q->data.coef;(6)若p->data.coef==0,删除p结点,p指向下一个结点,删除q结点,q指向下一个结点。
数据结构一元多项式报告

一元多项式计算:程序要求:1)、能够按照指数降序排列建立并输出多项式;2)、能够完成两个多项式的相加、相减,并将结果输入。
概要设计:1.功能:将要进行运算的多项式输入输出。
2.数据流入:要输入的多项式的系数与指数。
3.数据流出:合并同类项后的多项式。
4.程序流程图:多项式输入流程图如图3.2.1所示。
5.测试要点:输入的多项式是否正确,若输入错误则重新输入2、多项式的加法(1)功能:将两多项式相加。
(2)数据流入:输入函数。
(3)数据流出:多项式相加后的结果。
(4)程序流程图:多项式的加法流程图如图3.2.2所示。
(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。
3、多项式的减法(1)功能:将两多项式相减。
(2)数据流入:调用输入函数。
(3)数据流出:多项式相减后的结果。
(4)程序流程图:多项式的减法流程图如图3.2.3所示。
(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。
详细代码:#include<iostream>#include<conio.h>#include<stdlib.h>using namespace std; struct Node{float coef;//结点类型int exp;};typedef Node polynomial;struct LNode{polynomial data;//链表类型LNode *next;};typedef LNode* Link;void CreateLink(Link &L,int n);void PrintList(Link L);void PolyAdd(Link &pc,Link pa,Link pb);void PolySubstract(Link &pc,Link pa,Link pb); void CopyLink(Link &pc,Link pa);void PolyMultiply(Link &pc,Link pa,Link pb);int JudgeIfExpSame(Link pa,Link e);void DestroyLink(Link &L);int CompareIfNum(int i);void DestroyLink(Link &L){Link p;p=L->next;while(p){L->next=p->next;delete p;p=L->next;}delete L;L=NULL;}//创建含有n个链表类型结点的项,即创建一个n项多项式void CreateLink(Link &L,int n){if(L!=NULL){DestroyLink(L);}Link p,newp;L=new LNode;L->next=NULL;(L->data).exp=-1;//创建头结点p=L;for(int i=1;i<=n;i++){newp=new LNode;cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;cout<<"系数:";cin>>(newp->data).coef;cout<<"指数:";cin>>(newp->data).exp;if(newp->data.exp<0){cout<<"您输入有误,指数不允许为负值!"<<endl;delete newp;i--;continue;}newp->next=NULL;p=L;if(newp->data.coef==0){cout<<"系数为零,重新输入!"<<endl;delete newp;i--;continue;}while((p->next!=NULL)&&((p->next->data).exp<(newp->data).exp)){p=p->next; //p指向指数最小的那一个}if(!JudgeIfExpSame( L, newp)){newp->next=p->next;p->next=newp;}else{cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl;delete newp;DestroyLink(L);CreateLink(L,n); //创建多项式没有成功,递归调用重新创建break;}}}/*判断指数是否与多项式中已存在的某项相同*/int JudgeIfExpSame(Link L,Link e){Link p;p=L->next;while(p!=NULL&&(e->data.exp!=p->data.exp))p=p->next;if(p==NULL)return 0;else return 1;}/*输出链表*/void PrintList(Link L){Link p;if(L==NULL||L->next==NULL)cout<<"该一元多项式为空!"<<endl;else{p=L->next;//项的系数大于的种情况if((p->data).coef>0){if((p->data).exp==0)cout<<(p->data).coef;else if((p->data).coef==1&&(p->data).exp==1)cout<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"x^"<<(p->data).exp;else if((p->data).exp==1&&(p->data).coef!=1)cout<<(p->data).coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }//项的系数小于的种情况if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }p=p->next;while(p!=NULL){if((p->data).coef>0){if((p->data).exp==0)cout<<"+"<<(p->data).coef;else if((p->data).exp==1&&(p->data).coef!=1)cout<<"+"<<(p->data).coef<<"x";else if((p->data).exp==1&&(p->data).coef==1)cout<<"+"<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"+"<<"x^"<<(p->data).exp;else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp; }if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp;}p=p->next;}}cout<<endl;}/*把一个链表的内容复制给另一个链表*/void CopyLink(Link &pc,Link pa){Link p,q,r;pc=new LNode;pc->next=NULL;r=pc;p=pa;while(p->next!=NULL){q=new LNode;q->data.coef=p->next->data.coef;q->data.exp=p->next->data.exp;r->next=q;q->next=NULL;r=q;p=p->next;}}/*将两个一元多项式相加*/void PolyAdd(Link &pc,Link pa,Link pb){Link p1,p2,p,pd;CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode;pc->next=NULL;p=pc;p1=p1->next;p2=p2->next;while(p1!=NULL&&p2!=NULL){if(p1->data.exp<p2->data.exp){p->next=p1;p=p->next;p1=p1->next;}else if(p1->data.exp>p2->data.exp){p->next=p2;p=p->next;p2=p2->next;}else{p1->data.coef=p1->data.coef+p2->data.coef;if(p1->data.coef!=0){p->next=p1;p=p->next;p1=p1->next;p2=p2->next;}else{pd=p1;p1=p1->next;p2=p2->next;delete pd;}}}if(p1!=NULL){p->next=p1;}if(p2!=NULL){p->next=p2;}}/*将两个多项式相减*/void PolySubstract(Link &pc,Link pa,Link pb) {Link p,pt;CopyLink(pt,pb);p=pt;while(p!=NULL){(p->data).coef=(-(p->data).coef);p=p->next;}PolyAdd(pc,pa,pt);DestroyLink(pt);}//清屏函数void Clear(){system("pause");system("cls");}/*将两个一元多项式相乘*/void PolyMultiply(Link &pc,Link pa,Link pb) {Link p1,p2,p,pd,newp,t;pc=new LNode;pc->next=NULL;p1=pa->next;p2=pb->next;while(p1!=NULL){pd=new LNode;pd->next=NULL;p=new LNode;p->next=NULL;t=p;while(p2){newp=new LNode;newp->next=NULL;newp->data.coef=p1->data.coef*p2->data.coef;newp->data.exp=p1->data.exp+p2->data.exp;t->next=newp;t=t->next;p2=p2->next;}PolyAdd(pd,pc,p);CopyLink(pc,pd);p1=p1->next;p2=pb->next;DestroyLink(p);DestroyLink(pd);}}//菜单函数void Menu(){cout<<""<<endl;cout<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t\t\t [1] 创建要运算的两个一元多项式\t\t "<<endl; cout<<"\t\t\t [2] 将两个一元多项式相加\t\t\t "<<endl; cout<<"\t\t\t [3] 将两个一元多项式相减\t\t\t "<<endl; cout<<"\t\t\t [4] 将两个一元多项式相乘\t\t\t "<<endl; cout<<"\t\t\t [5] 显示两个一元多项式\t\t\t "<<endl;cout<<"\t\t\t [6] 销毁所创建的二个多项式\t\t "<<endl; cout<<"\t\t\t [7] 退出\t\t\t\t\t "<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<endl;cout<<"\t\t 请选择:";}//判断输入的整数是不是为到的数字int CompareIfNum(int i){if(i>0&&i<8)return 0;else return 1;}void main(){{system("color b");//system("pause");system("color a");//system("pause");}int n;Link L,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式int choose;while(1){Menu(); //调用菜单函数cin>>choose;switch(choose){case 1:cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(La,n);cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(Lb,n);Clear();break;case 2:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyAdd(L,La,Lb);cout<<""<<endl;cout<<"待相加的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相加后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 3:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolySubstract(L,La,Lb);cout<<"相减的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相减后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 4:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyMultiply(L,La,Lb);cout<<"相乘的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相乘后的结果为:";PrintList(L);DestroyLink(L);cout<<""<<endl;Clear();break;case 5:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}cout<<"一元多项式A为:"<<endl;PrintList(La);cout<<""<<endl;cout<<"一元多项式B为:"<<endl;PrintList(Lb);cout<<""<<endl;Clear();break;case 6:if(La&&Lb){DestroyLink(La);DestroyLink(Lb);cout<<"多项式销毁成功!"<<endl;Clear();}else{cout<<"多项式不存在,请重新选择^^^"<<endl;Clear();}break;case 7:exit(0); //exit(0)强制终止程序,返回状态码表示正常结束default:cout<<"您的输入有误,请重新选择操作……"<<endl;Clear();break;}}}。
数据结构《一元多项式》

一元多项式相加问题实验报告本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述通过键盘输入两个形如Po+P₁X¹+P₂X²+…+PX的多项式,经过程序运算后在屏幕上输出它们的相加和。
二、数据结构设计分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数-指数”两部份组成,因此可将其抽象为包含系数coef、指数 exp、指针域next 构成的链式线性表。
对多项式中系数为0的子项可以不记录它的指数值,将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的挪移来构成新的线性表,期间可以将某些不需要的空间回收。
基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。
具体数据类型定义为:struct nodefloat coef;//系数域int exp; //指数域struct node *next;};三、功能函数设计1、输入并建立多项式的功能模块具体函数为node *in f un()此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时住手输入。
关键步骤具体如下:(1)控制用户按照指数递增的顺序输入r=a;while(r!=q->next)if(y<=r->exp)cout<<"请按照指数递增顺序输入,请重新输入";cin>>x>>y;break;r=r->next;从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重新输入。
(2)当输入的系数为零时,不为其分配存储空间存储while(x==0){cin>>x>>y;continue;}即若系数为0,再也不进行动态分配并新建结点,而是重新提取用户输入的下一个子项的系数和指数,利用continue 进入下一次循环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告实验名称:实验一——多项式的实现学生姓名:班级:班内序号:学号:日期:2011年10月29日1.实验要求实验目的:1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2.学习指针、模板类、异常处理的使用3.掌握线性表的操作的实现方法4.学习使用线性表解决实际问题的能力实验内容:利用线性表实现一个一元多项式Polynomialf(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+;2.2.4 系数不为0和1,指数不为0和1,输出(coef)x^(expn)+;3.将指针指向移到最后一个节点。
重复2.2中判断,但不输出+号。
·伪代码描述:1.term* m=front;2.for(int i=0;i<n-1;i++)2.1m=m->next;2.2if(m->coef==1&&(m->expn!=1&&m->expn!=0))cout<<"x^"<<m->expn<<"+";2.3else if(m->coef==1&&m->expn==0)cout<<m->coef<<"+";2.4else if(m->coef!=1&&m->expn==0)cout<<m->coef<<"+";2.5else if(m->coef!=0&&m->expn==1)cout<<m->coef<<"x"<<"+";2.6else if(m->coef==1&&m->expn==1)cout<<"x"<<"+";2.7else if(m->coef==0)cout<<""<<"+";2.8elsecout<<m->coef<<"x^"<<m->expn<<"+";3.m=m->next;3.1if(m->coef==1&&(m->expn!=1&&m->expn!=0))cout<<"x^"<<m->expn<<"";3.2else if(m->coef==1&&m->expn==0)cout<<m->coef;3.3else if(m->coef!=1&&m->expn==0)cout<<m->coef;3.4else if(m->coef!=1&&m->expn==1)cout<<m->coef<<"x"<<"";3.5else if(m->coef==1&&m->expn==1)cout<<"x";3.6else if(m->coef==0)cout<<"";3.7elsecout<<m->coef<<"x^"<<m->expn<<"";时间复杂度:O(n)空间复杂度:S(1)3.多项式的相加相减·自然语言描述:1.指针p和q分别指向a和b两个多项式的头结点的下一个节点;2.将结果多项式的项数置为0;3.只有p或q非空,进行以下循环:3.1申请一个term*型的指针d,将其next域赋为NULL;进行判断:3.3.1如果p和q均非空3.3.3.1如果p和q的指数相等将d的系数赋为p、q系数之和,指数不变,将p、q指向后移;3.3.3.2如果p->expn>q->expn复制q到结果多项式(减法系数为q->coef的相反数)3.3.3.3如果p->expn<q->expn复制p到结果多项式3.3.3.4 判断后将项数++,插入新节点d;3.3.2如果q为空,p仍存在,逐项将p复制到结果多项式。
每进行一次,项数++,p后移。
3.3.3如果p为空,q仍存在,逐项将q复制到结果多项式(减法将系数变为原来的相反数)。
每进行一次,项数++,q后移。
3.2返回结果多项式的项数·伪代码描述:1.工作指针p、q初始化:term* p=front->next;term* q=b.front->next;2. int nAdd=0;//加法int nMinus=0;//减法3. while(p||q)3.1 term* d=new term;d->next=NULL;3.3.1 if(p&&q)3.3.3.1 if(p->expn==q->expn)d->coef=p->coef+q->coef;d->expn=p->expn;p=p->next;q=q->next;//加法d->coef=p->coef-q->coef;d->expn=p->expn;p=p->next;q=q->next;//减法3.3.3.2 p->expn>q->expnd->coef=q->coef;d->expn=q->expn;q=q->next;//加法d->coef=-q->coef;d->expn=q->expn;q=q->next;//减法3.3.3.3p->expn<q->expnd->coef=p->coef;d->expn=p->expn;p=p->next;//加法d->coef=p->coef;d->expn=p->expn;p=p->next;//减法3.3.3.4 nAdd++;add.Insert(d);//加法nMinus++;min.Insert(d);//减法3.3.2 while(p)term* d=new term;d->coef=p->coef;d->expn=p->expn;d->next=NULL;nAdd++;add.Insert(d);p=p->next;//加法term* d=new term;d->coef=(p->coef);d->expn=p->expn;d->next=NULL;nMinus++;min.Insert(d);p=p->next;//减法3.3.3 while(q)term* d=new term;d->coef=q->coef;d->expn=q->expn;d->next=NULL;nAdd++;add.Insert(d);q=q->next;//加法term* d=new term;d->coef=0-(q->coef);d->expn=q->expn;d->next=NULL;nMinus++;min.Insert(d);q=q->next;//减法3.2 return nAdd; return nMinus;时间复杂度:O(n)空间复杂度:O(2)4.求值·自然语言描述:1.将工作指针指向多项式的第一项;2.将结果result置为0;3.指针不为空,即进行循环:3.1 result+=s->coef*(pow(x,s->expn));3.2 s=s->next;4.返回result;·伪代码描述:1.term* s=front->next;2.float result=0;3.while(s)3.1 result+=s->coef*(pow(x,s->expn));3.2 s=s->next;4. return result;时间复杂度:O(n)空间复杂度:S(1)5.求导数·自然语言描述:1.将指针指到多项式的第一项的结点:term* p=a.front->next;2.循环n次2.1每项求导的系数为:p->coef*p->expn;指数为:p->expn-1;2.2将新结点插入新链表;2.3指针p后移。