数据结构C语言版 抽象数据类型Polynomial一元多项式的实现文库
- 格式:doc
- 大小:46.00 KB
- 文档页数:13
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int ElemType;/*单项链表的声明*/typedef struct PolynNode{int coef; // 系数int expn; // 指数struct PolynNode *next;}PolynNode,*PolynList;/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/ /*指数系数一对一对输入*/void CreatePolyn(PolynList &L,int n){int i;PolynList p,q;L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点L->next=NULL;q=L;printf("成对输入%d个数据\n",n);for(i=1;i<=n;i++){p=(PolynList)malloc(sizeof(PolynNode));scanf("%d%d",&p->coef,&p->expn); //指数和系数成对输入q->next=p;q=q->next;}p->next=NULL;}// 初始条件:单链表L已存在// 操作结果: 依次对L的每个数据元素调用函数vi()。
一旦vi()失败,则操作失败void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)){PolynList p=L->next;while(p){vi(p->coef, p->expn);if(p->next){printf(" + "); //“+”号的输出,最后一项后面没有“+” }p=p->next;}printf("\n");}/*ListTraverse()调用的函数(类型要一致)*/void visit(ElemType c, ElemType e){if(c != 0){printf("%dX^%d",c,e); //格式化输出多项式每一项}}/* 多项式相加,原理:归并 *//* 参数:两个已经存在的多项式 *//* 返回值:归并后新的多项式的头结点 */PolynList MergeList(PolynList La, PolynList Lb){PolynList pa, pb, pc, Lc;pa = La->next;pb = Lb->next;Lc = pc = La; // 用La的头结点作为Lc的头结点while(pa&&pb){if(pa->expn < pb->expn){pc->next = pa; //如果指数不相等,pc指针连上指数小的结点,pc = pa;pa = pa->next; //指向该结点的指针后移}else if(pa ->expn > pb->expn ){pc->next = pb; //pc指针连上指数小的结点,pc = pb;pb = pb->next; //指向该结点的指针后移}else//(pa ->expn = pb->expn ){pa->coef = pa->coef + pb->coef; //指数相等时,系数相加 pc->next = pa;pc = pa;pa = pa->next; //两指针都往后移pb = pb->next;}}pc->next = pa ? pa:pb; // 插入剩余段return Lc;}void main(){PolynList ha,hb,hc;printf("非递减输入多项式ha, ");CreatePolyn(ha,5); // 正位序输入n个元素的值printf("非递减输入多项式hb, ");CreatePolyn(hb,5); // 正位序输入n个元素的值printf("多项式ha :");PolynTraverse(ha, visit); printf("\n");printf("多项式hb :"); PolynTraverse(hb, visit); printf("\n");hc = MergeList(ha,hb); PolynTraverse(hc, visit); }。
《数据结构》课程设计报告系别:计算机与电子系专业班级:电子0802班学生姓名:胡锦奎(20081185055)指导教师:程海英(课程设计时间:20 10 年12月27日——20 11 年1月7日)华中科技大学武昌分校目录1.课程设计目的…………………………………………………………………3页2.课程设计题目描述和要求……………………………………………3页3.课程设计报告内容……………………………………………………………5页3.1 一元多项式运算的实现…………………………………………………5页3.2 迷宫问题实现……………………………………………………………9页3.3 校园导游咨询……………………………………………………………13页3.4 跳舞搭配问题……………………………………………………………15页3.5 利用栈实现表达式求值…………………………………………………18页4.总结………………………………………………………………………… 20页参考文献……………………………………………………………………… 21页(要求:目录题头用三号黑体字居中书写,隔行书写目录内容。
目录中各级题序及标题用小四号黑体)一.课程设计目的:数据结构课程设计是在学完数据结构课程之后的实践教学环节.该实践教学是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧。
要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法.学生通过数据结构课程设计在各方面得到锻炼二.课程设计题目描述和要求:1.一元多项式加法、减法、乘法运算的实现1)设计内容:完成两个一元多项式作加法、减法、乘法,给出明确的等式形式。
完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;函数功能要划分好,总体设计应画流程图,程序一定要经得起测试2)设计要求(1)用C语言编程实现上述实验内容中的结构定义和算法。
(2)要有main()函数,并且在main()函数中使用检测数据调用上述算法。
Polynomial数据结构之一元多项式(界面友好版)信安1班学生试验报告代码refantyPolynomial一元多项式(数据结构)界面友好版#include#include#define LEN sizeof(struct Polynomial)#define NUM 10#define NAME 3//#include //VC++ 6.0须添加 VS 2010可不加using namespace std;typedef char PNAME[NAME];typedef struct Polynomial{float coef;//系数int expn;//指数Polynomial *next;//指向多项式的下一项} *Polyn;//多项式结点指针struct PolynInfo{int Pbytes;//存放多项式总字节数int Pterms;//存放项数PNAME Pname;//多项式表达式函数名Polyn Pfirst;//指向多项式的第一项} Pn[NUM];//存放多项式信息的列表void ShowPolyn(int i){//输出单个多项式int a=0;Pn[i].Pbytes=0;Polyn L=Pn[i].Pfirst;{cout<<'0';Pn[i].Pbytes++;}for(;L;L=L->next,a++){if (a)//判断是否首项if (L->coef>0){cout<<"+";Pn[i].Pbytes++;}else if (L->coef==0) cout<<"ERROR_00(存在0结点尚未删除)";if (L->coef==1)//判断系数{if (L->expn==0){cout<<"1";Pn[i].Pbytes++;}}else if (L->coef==-1){if (L->expn==0){cout<<"-1";Pn[i].Pbytes+=2;}{cout<<"-";Pn[i].Pbytes++;}}else if (L->coef==0) cout<<"ERROR_00(存在0结点尚未删除)";else{cout<coef;char sbuf[25];//gcvt(L->coef,6,sbuf); //VC++ 6.0_gcvt_s(sbuf,L->coef,6);//VS 2010int k=strlen(sbuf);if (L->coef-(int)L->coef==0) k--;Pn[i].Pbytes+=k;}if (L->expn==0);//判断指数else if (L->expn==1){cout<<"x";Pn[i].Pbytes++;}else{cout<<"x^"<expn;int l=1,e=L->expn;while(e/10){e/=10;}Pn[i].Pbytes+=L->expn>0?l+2:l+3;}}if (Pn[i].Pterms!=a) cout<<"ERROR_02(项数不匹配)";}void PolynList(){//显示多项式列表cout<<"多项式列表:\n";cout<<"┌─────────────────────────────────────┐\n";cout<<"│编号│名称│表达式│\n";for(int i=0;i<num&&(pn[i].pbytes);i++){cout<<"├──┼──┼───────────────────────────────┤\n";cout<<"│ ";i==9?cout<<"":cout<<" ";cout<<i+1<<" "<<pn[i].pname;if (!Pn[i].Pname[1]) cout<<" ";cout<<" │";ShowPolyn(i);for (int k=0;k<(int)(62-Pn[i].Pbytes);k++) cout<<" ";cout<<"│\n";}cout<<"└─────────────────────────────────────┘\n";cout<<"(非法输入后可选择回到主菜单!)\n\n";}void DefaultName(PNAME name){//定义默认命名规则name[0]='f';char c[]={"0123456789"};i</i+1<<"></num&&(pn[i].pbytes);i++)nt j=0,k=0;for (;j<10&&(Pn[0].Pbytes);j++){for (int i=0;!k;i++){if (Pn[i].Pbytes){if (Pn[i].Pname[0]=='f'&&Pn[i].Pname[1]!='\0'){if (Pn[i].Pname[1]==c[j]) break;}continue;}else {++k;break;}if (Pn[i+1].Pbytes) ++k;}if (k) break;}name[1]=c[j];name[2]='\0';}void CheckName(PNAME name){//检查名称if ( isalpha(name[0]) && ( isdigit(name[1]) || isalpha(name[1])|| ( !(name[1]) ) ) ){for (int i=0;Pn[i].Pbytes;i++)if (!strcmp(name,Pn[i].Pname)) {DefaultName(name); break;}}else DefaultName(name);}void InsertNode(Polyn p,int i) {//插入多项式结点,默认降序排列if(p->coef==0){free(p);Pn[i].Pterms--;}else{Polyn p1,p2;p1=Pn[i].Pfirst;p2=p1;while (p2&&p->expnexpn) {p1=p2;p2=p2->next;}if (p2&&p->expn==p2->expn) {//指数相同,系数相加p2->coef+=p->coef;free(p);Pn[i].Pterms--;if (!p2->coef){//相加后系数为0(p2==p1?Pn[i].Pfirst:p1->next)=p2->next;free(p2);Pn[i].Pterms--;}}else{//插入新结点(p2==p1?Pn[i].Pfirst:p1->next)=p;p->next=p2;}}}int PolynNumber(){//统计多项式数量int l=0;while (Pn[l].Pbytes) l++;return l;}void CreatPolyn(){//新增多项式int jx=0;while (1){if (jx){cout<<"(直接回车)继续创建多项式或(先按其它键)回到主菜单";cin.sync();if (cin.get()!='\n') {cin.sync();break;}else{if (Pn[NUM-1].Pbytes){cout<<"\nERROR_03(超出操作范围)\n请先删除多项式以腾出存储空间\n";system("pause");break;}system("cls");PolynList();cout<<"\n多项式命名规则:";cout<<"(首字符为字母,第二字符可为字母、数字或留空。
数据结构C语言版抽象数据类型Polynomial一元多项式的实现文库.txt生活是过出来的,不是想出来的。
放得下的是曾经,放不下的是记忆。
无论我在哪里,我离你都只有一转身的距离。
/*数据结构C语言版抽象数据类型Polynomial一元多项式的实现P42-43编译环境:Dev-C++ 4.9.9.2日期:2011年2月10日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>// 抽象数据类型Polynomial一元多项式的实现typedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;// 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct _LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;#define DestroyPolyn DestroyList#define PolynLength ListLength// 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置// 若无前驱,则返回NULLPosition PriorPos(LinkList L,Link p){Link q;q=L.head->next;if(q==p) // 无前驱return NULL;else{while(q->next!=p) // q不是p的直接前驱q=q->next;return q;}}// 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回1;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。
长沙学院课程设计说明书题目一元多项式计算问题系(部)计算机科学与技术系专业(班级)12软件4班姓名谢仲蛟学号2012022411指导教师邱建雄起止日期2013.12.9~2013.12.20课程设计任务书课程名称:数据结构与算法设计题目:一元多项式计算问题已知技术参数和设计要求:问题描述:设计一个稀疏多项式简单计算器基本要求:(1)输入并分别建立多项式A和B(2)输入输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei 是第i项的系数和指数,序列按指数降序排列(3)完成两个多项式的相加、相减,并将结果输出;测试数据:(1) A+B A= 3x14-8x8+6x2+2 B=2x10+4x8+-6x2(2) A-B A=11x14+3x10+2x8+10x6+5 B=2x14+3x8+5x6+7(3) A+B A=x3+x1 B=-x3-x1(4) A+B A=0 B=x7+x5+x3+x1(5) A-B A=100x100+50x50+20x20+x B=10x100+10x50+10x20+x选作内容:(1).多项式在x=1时的运算结果(2)求多项式A和B的乘积设计工作量:40课时工作计划:指导教师签名:日期:教研室主任签名:日期:系主任签名:日期:长沙学院课程设计鉴定表摘要本次课程设计是在《数据结构》基础上设计以C语言来实现的,它的目的是帮助同学更深入的了解《数据结构》这门课程并熟练运用C语言,使同学达到熟练掌握的程度。
课程设计一个稀疏多项式简单计算器。
其基本要求有六:其一,输入建立两个多项式;其二,输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数的降序序列排列;其三,多项式排序,多项式按指数的降序序列排列;其四,多项式相加,指数相同系数相加,指数不同则把此项加进去;其五,多项式相减,指数相同系数相加,指数不同则把此项取反再加进去;其六,返回多项式的项数。
一、一元稀疏多项式计算器#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;#define LIST_INIT_SIZE 51 //假设次数不超过50typedef struct{//coef表示系数,expo表示指数。
float coef;int expo;}ElemType;typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}LNode,*LinkList;//记:Link与Position均为指向LNode的指针类型typedef LinkList Polynomail;//在单链表的基础上定义并实现//多项式用链表存储Status CreateList_L(LinkList &L){int n;printf("请输入需创建的多项式的长度:\n");scanf("%d",&n);LNode *CurPtr,*PrePtr;//创建递增链表L=(LinkList) malloc(sizeof(LNode));L->next=NULL;if(!L) exit(OVERFLOW);PrePtr=L;for(int i=1;i<=n;++i){CurPtr=(LNode *)malloc(sizeof(LNode));printf("请输入不同的多项式的非0系数:");scanf("%f",&(CurPtr->data).coef );printf("请输入不同的多项式的指数:");scanf("%d",&(CurPtr->data).expo );CurPtr->next=NULL;PrePtr->next=CurPtr;PrePtr=PrePtr->next;//插入到表头}CurPtr->next =L;//冒泡排序法对多项式按指数由大到小排列。
文章标题:深入理解C语言中的数据结构实现——一元多项式的基本运算在C语言中,数据结构是非常重要的一个概念,它为我们处理各种复杂的数据提供了便利。
其中,一元多项式的基本运算是数据结构中的一个重要内容,它涉及到多种数据结构的操作和算法,是我们学习C 语言中数据结构的一个重要入口。
在本文中,我们将深入探讨C语言中一元多项式的基本运算,帮助读者更深入地理解这一重要的概念。
一、一元多项式的表示方式在C语言中,一元多项式可以使用数组来表示。
每个数组元素对应一个项,数组的下标对应每一项的次数,数组的值对应该项的系数。
一个一元多项式可以表示为:```cfloat polynomial[10] = {0, 1, 2, 0, 4}; // 表示多项式 1 + 2x + 4x^4 ```二、一元多项式的基本运算1. 一元多项式的加法有两个多项式 A 和 B,它们分别表示为 `float polynomialA[10]` 和`float polynomialB[10]`,那么它们的加法运算可以表示为:```cfor (int i = 0; i < 10; i++) {polynomialC[i] = polynomialA[i] + polynomialB[i];}```2. 一元多项式的减法一元多项式的减法是指将两个多项式相减得到一个新的多项式。
与加法类似,多项式 A 和 B 的减法运算可以表示为:```cfor (int i = 0; i < 10; i++) {polynomialC[i] = polynomialA[i] - polynomialB[i];}```3. 一元多项式的乘法式 A 和 B 的乘法运算可以表示为:```cfor (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {polynomialC[i+j] += polynomialA[i] * polynomialB[j];}}```4. 一元多项式的除法一元多项式的除法涉及到较为复杂的算法,需要考虑余数和商的处理。
题目:编制一个一元多项式基本运算的程序姓名: 学号:PB110130一、需求分析1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。
由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。
2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。
3.程序设计是在VC6.0环境下设计的的。
4.程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode *MakeNode(double coef, int exp) 通过传入指数和系数创建一个节点,返回该节点的地址。
2.void InitList(LinkList &L)初始化,带头节点3.void PrintPolyn (LinkList L) 传入链表的指针,打印该链表4.LinkList CreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L5.double SumPolyn(LinkList L,double x) 传入链表的指针及x值,求多项式的值。
6.void DestroyPolyn (LinkList &L) 销毁多项式,去掉头节点7.void ClearPolyn (LinkList &L) 清空多项式,保留节点实验报告8.void CopyPolyn (LinkList La,LinkList &Lb) 将La位置的多项式复制到Lb位置9.void AddPolyn(LinkList L,LinkList J ,LinkList &K) 将a和b多项式相加存到c10.void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b相减存到c11. void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b多项式相乘存到c12。
c语言数据结构实现——一元多项式的基本运算在C语言中,一元多项式的表示与运算是常见的数据结构操作之一。
一元多项式由一系列具有相同变量的单项式组成,每个单项式由系数和指数组成。
本文将介绍如何使用C语言实现一元多项式的基本运算,包括多项式的创建、求和、差、乘积等操作。
首先,我们需要定义一个结构体来表示单项式。
每个单项式由一个系数和一个指数组成,我们可以将其定义如下:```cstruct term{float coefficient; // 系数int exponent; // 指数};typedef struct term Term;```接下来,我们可以定义一个结构体来表示一元多项式。
一元多项式由一系列单项式组成,可以使用一个动态数组来存储这些单项式。
```cstruct polynomial{Term* terms; // 单项式数组int num_terms; // 单项式数量};typedef struct polynomial Polynomial;```现在,我们可以开始实现一元多项式的基本运算了。
1. 创建一元多项式要创建一元多项式,我们需要输入每个单项式的系数和指数。
我们可以使用动态内存分配来创建一个适应输入的单项式数组。
```cPolynomial create_polynomial(){Polynomial poly;printf("请输入多项式的项数:");scanf("%d", &poly.num_terms);poly.terms = (Term*)malloc(poly.num_terms * sizeof(Term));for(int i = 0; i < poly.num_terms; i++){printf("请输入第%d个单项式的系数和指数:", i+1);scanf("%f %d", &poly.terms[i].coefficient, &poly.terms[i].exponent);}return poly;}```2. 求两个一元多项式的和两个一元多项式的和等于对应指数相同的单项式系数相加的结果。
51 exp :指数域,存放非零项的指数。
next :指针域,存放指向下一个结点的指针。
一元多项式的抽象数据类型定义如下:ADT Polynomial{数据对象:{|,1,2,,,0}i i D a a ElemSet i n n =∈= ≥数据关系:11{,|,,2,3,,}i i i i R a a a a D i n --=〈〉∈=基本操作:CreatPolyn ( &P , m ) //1操作结果:输入 m 项的系数和指数,建立一元多项式 P 。
DestroyPolyn ( &P ) //2初始条件:一元多项式P 已存在。
操作结果:销毁一元多项式P 。
PrintPolyn ( &P ) //3初始条件:一元多项式P 已存在。
操作结果:打印输出一元多项式P 。
PolynLength( P ) //4初始条件:一元多项式P 已存在。
操作结果:返回一元多项式P 中的项数。
AddPolyn ( &Pa, &Pb ) //5初始条件:一元多项式Pa 和Pb 已存在。
操作结果:完成多项式相加运算Pa = Pa +Pb ,并销毁一元多项式Pb 。
SubtractPolyn ( &Pa, &Pb ) //6初始条件:一元多项式Pa 和Pb 已存在。
操作结果:完成多项式相减运算Pa = Pa - Pb ,并销毁一元多项式Pb 。
MultiplyPolyn ( &Pa, &Pb ) //7初始条件:一元多项式Pa 和Pb 已存在。
操作结果:完成多项式相乘运算Pa = Pa*Pb ,并销毁一元多项式Pb 。
}ADT Polynomial2.4.2 一元多项式的实现一元多项式结点的类型定义为: #define Max 20typedef struct{float coef;int exp;}PolyArray[Max];struct PolyNode{float coef;int exp;PolyNode *next;};。
数据结构C语言版抽象数据类型Polynomial一元多项式的实现文库.txt生活是过出来的,不是想出来的。
放得下的是曾经,放不下的是记忆。
无论我在哪里,我离你都只有一转身的距离。
/*数据结构C语言版抽象数据类型Polynomial一元多项式的实现P42-43编译环境:Dev-C++ 4.9.9.2日期:2011年2月10日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>// 抽象数据类型Polynomial一元多项式的实现typedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;// 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct _LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;#define DestroyPolyn DestroyList#define PolynLength ListLength// 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置// 若无前驱,则返回NULLPosition PriorPos(LinkList L,Link p){Link q;q=L.head->next;if(q==p) // 无前驱return NULL;else{while(q->next!=p) // q不是p的直接前驱q=q->next;return q;}}// 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回1;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。
数据结构上机实习报告实验题目:实现一元多项式抽象数据类型班级:姓名:学号:指导老师:完成日期:1、需求分析1.1问题描述和规格说明已知一元n次多项式:设计程序实现一元n次多项式的抽象数据类型,模拟一元n次多项式的操作行为。
包括:数据元素:a i,存储结构,逻辑操作:1、构造一个空的多项式2、多项式插入新的一项3、多项式合并同类项4、多项式的加法P n(x)+Q n(x)=R t(x)5、多项式的乘法P n(x)*Q n(x)=R t(x)6、打印多项式7、计算多项式的值1.2功能需求1)首先构造两三个多项式供用户使用;2)用户可以进行添加多项式或是添加多项式中的项;3)或是修改其中的项,或是对多项式进行删除,或仅仅删除其中的某项;4)或是查看当前的某项多项式5) 用户赋予多项式变量x值后可以计算多项式的值6)可以计算两个或是多个多项式的和;7)可以计算两个以上多项式的乘积8)可以对多项式中的同类项进行合并2、设计(目标:有效组织与处理数据)2.1抽象数据类型:因为每个多项式有n个项,每个项包含不同的系数和指数,多项式的系数a i抽象为整数,变量x也是整数,x的次幂n也是整数,故多项式的每一项抽象为一个Nape类型的节点,包括:a i、x、n数据元素,最后整个一元n次多项式抽象为Polynomial数据类型。
详细设计如下:Nope类型设计为:class Nope{friend class Polynomial; //设置Polynomial为Nope的友元类,方便Polynomial类访问Nope的私有数据成员private:int m_factor; //项系数int m_times; //次幂public:Nope(int factor=0,int times=0);//构造函数~Nope();int GetFoctor()const; //获取项系数int GetTimes()const; //获取次幂void SetFactor(int factor); //设置项系数void SetTimes(int times); //设置次幂Nope & operator=(const Nope& item); //赋值=int operator<=(const Nope& item); //比较<=//比较次幂的大小friend ostream &operator<<(ostream& out, const Nope&item); //输出<<Nope(const Nope& item); //复制构造&};Polynoomial数据类型设计为:class Polynomial{private:int m_x; //多项式中的变量xint m_size; //多项式的项数LinListWithRear< Nope > m_list; //存储多项式的带尾指针的单向链表public:Polynomial(int size = 0,int factor= 1);//可以构造系数为factor,个数为size 的多项式,次幂依次增长~Polynomial();Polynomial(const Polynomial&poly);int GetM_size()const; //获取多项式的项数int GetM_x()const;int GetM_factor(const int& index)const; //获取第index项的系数//从第1项开始(而不是第0项)int GetM_times(const int& index)const; //获取第index项的次幂inline double GetM_Number(const int& index)const; //获取第index项的值,因为计算多项式的值时频繁调用,所以设计为内联函数int Getfactor(const int& times)const; //获取次幂为times的项的系数 //失败或没有,返回0int GetIndex(const int& times)const; //获取次幂为times 的项的下标//从1开始double GetNumber(const int& times)const; //获取次幂为times的项的值 //失败或没有返回0double GetTotalNumber()const; //获取整个多项式的值int SetM_factor(const int& index,const int& factor); //设置第index项的系数//从第1项开始(而不是第0项)int Setfactor(const int& times,const int& factor); //设置次幂为times 的项的系数//失败返回0int SetM_times(const int& index, const int& times); //设置次幂为times 的项的系数//失败返回0int SetM_x(const int & x); //给未知数m_x赋值bool DeleteIndex(const int & index); //删除第index项bool DeleteTimes(const int & times); //删除次幂为times的项bool DeleteFactor(const int& factor); //删除所有系数为factor的项inline int InsertEnd(const int& factor, const int& times); //从尾部插入新项,系数为factor,次数为times//失败返回0inline void InsertEnd(const Nope& item);Polynomial& operator=(const Polynomial&Poly); //赋值void Combine(); //合并同类项且按次幂排序void Print()const; //打印多项式void OrderPolynomial(); //按次幂排序多项式int OrderInsert(const int& factor, const int& times); //有序插入新项,系数为factor,次数为times//失败返回0Polynomial operator+(const Polynomial&polyb); //多项式的加法Polynomial operator*(const Polynomial&polyb); //多项式的乘法friend ostream &operator<<(ostream& out, const Polynomial& item);//输出<<};2.2存储结构设计:1)存储结构的确定数据结构的目的是有效组织和处理数据。
数据结构实验室开放项目实验报告题目:一元符号多项式的表示及运算姓名:班级:学号:一、内容总结1.算法概要设计:①一元多项式的创建Status CreatPolyn(polynomail P)②一元多项式的加法void AddPolyn(polynomail Pa,polynomail Pb)③一元多项式的减法void SubPolyn(polynomail Pa,polynomail Pb)④一元多项式的乘法⑤void MultPolyn(polynomail P a,polynomail Pb)2.发现的问题:根据上面的设计纲要展开程序的设计,在程序编写和调试过程中主要遇到以下几点问题:①函数形参与实参的传递情况,经常忘记传值不传址的概念,导致程序运行错误。
在初始化和建立多项式等一些以改变原来多项式的一定要用指针传递。
②程序运行控制条件考虑不足,例如在乘法函数的循环控制中,条件选取错误,使得结果不正确。
③链表的链接混乱,链表链接有疏漏,指针链接情况考虑不周全,例如在加法case1中,没有移动ta,导致结果错误。
④程序编写技巧运用,减法就是加法,编写取反函数,将被减数各项取反,减法可用加法实现。
在乘法中,也是利用加法实现。
3.解决方法:通常采用的方法为自我思考摸索,主要手段是查资料和上网搜索,然后与同学间相互讨论,请教老师。
当自我期望与现实差距过大时,自行规避一段时间,自行调节情绪,有意识的讲问题随身携带,随时随地的思考。
二、实验展示1.输入要求按照多项式指数递增的顺序,依次输入多项式的参数对,第一个参数为系数,后一个参数为指数,如输入1 2,表示x^2项。
以输入系数为零的项为结束。
例:1 2 3 4 5 6 8 9 0 3然后回车,就会建立一元多项式:x^2+3x^4+5x^6+8x^9。
2.输出要求输出内容为建立和运算之后的结果。
多项式有序的按照指数递增的顺序,输出参数对,以小括号为一个单位,第一个为系数,第二个为指数。
数据结构一元多项式的运算数据结构一元多项式的运算简介一元多项式是数学中常见的概念,用于表示一个变量的多项式表达式。
在计算机科学中,经常需要对一元多项式进行各种运算,如加法、减法、乘法等。
为了实现这些运算,可以使用数据结构来存储和操作一元多项式。
本文将介绍一元多项式的数据结构和常见的运算方法,并给出相应的代码示例。
数据结构一元多项式可以用链表来表示。
每个节点包含两个部分:系数(coefficient)和指数(exponent)。
系数表示该项的权重,指数表示该项的幂次。
链表的每个节点按照指数的升序排列。
以下是一个一元多项式的链表表示的示例:```markdown1.2x^2 + 3.7x^4 - 0.5x^3 -2.1x^1 + 4.0``````markdownNode 1: coefficient=1.2, exponent=2Node 2: coefficient=3.7, exponent=4Node 3: coefficient=-0.5, exponent=3Node 4: coefficient=-2.1, exponent=1Node 5: coefficient=4.0, exponent=0```运算方法加法运算两个一元多项式相加可以按照如下步骤进行:1. 遍历两个链表的节点,分别取出当前节点的系数和指数。
2. 如果两个节点的指数相等,将系数相加,并将其作为结果链表的节点。
3. 如果两个节点的指数不相等,将指数较小的节点插入结果链表,并继续遍历指数较大的节点。
4. 当其中一个链表遍历完后,直接将另一个链表的节点插入结果链表。
以下是加法运算的代码示例:```pythondef addPolynomials(p1, p2):result = Nonetl = Nonewhile p1 is not None and p2 is not None:if p1.exponent == p2.exponent:coef_sum = p1.coefficient + p2.coefficient if coef_sum != 0:node = Node(coef_sum, p1.exponent)if result is None:result = tl = nodeelse:tl.next = nodetl = nodep1 = p1.nextp2 = p2.nextelif p1.exponent > p2.exponent:node = Node(p1.coefficient, p1.exponent) if result is None:result = tl = nodeelse:tl.next = nodetl = nodep1 = p1.nextelse:node = Node(p2.coefficient, p2.exponent) if result is None:result = tl = nodeelse:tl.next = nodetl = nodep2 = p2.nextwhile p1 is not None:node = Node(p1.coefficient, p1.exponent)if result is None:result = tl = nodeelse:tl.next = nodetl = nodep1 = p1.nextwhile p2 is not None:node = Node(p2.coefficient, p2.exponent) if result is None:result = tl = nodeelse:tl.next = nodetl = nodep2 = p2.nextreturn result```减法运算减法运算可以看作加法运算的特殊情况,即将第二个多项式的系数取负数,再进行加法运算。
一元多项式的计算数据结构专业课程设计一元多项式的计算—加,减摘要(题目)一元多项式计算任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输入;目录一:引言:通过C语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。
按指数降序排列。
二:需求分析建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果三:概要设计存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
1.单连表的抽象数据类型定义:ADT List{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={<ai-1,ai>| ai-1, ai∈D,i=2,…,n}基本操作:InitList(&L)//操作结果:构造一个空的线性表CreatPolyn(&L)//操作结果:构造一个以单连表存储的多项试DispPolyn(L)//操作结果:显示多项试Polyn(&pa,&pb)//操作结果:显示两个多项试相加,相减的结果} ADT List2.本程序包含模块: typedef struct LNode //定义单链表{}LNode,*LinkList;void InitList(LinkList &L) //定义一个空表{ }void CreatPolyn(LinkList &L) //用单链表定义一个多项式{ }void DispPolyn(LinkList L) //显示输入的多项式{ }void Polyn(LinkList &pa,LinkList &pb){}void main(){//定义一个单连表;cout<<endl<<" *****************欢迎来到一元多项式计算程序 *************** "<<endl;LNode *L1,*L2;Polyn(L1,L2); }加,减操作模块——实现加减操作各模块之间的调用关系如下:主程序模块加法操作模块 减法操作模块基本算法:1、输入输出(1)功能:将要进行运算的多项式输入输出。
/*数据结构C语言版抽象数据类型Polynomial一元多项式的实现P42-43编译环境:Dev-C++ 4.9.9.2日期:2011年2月10日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>// 抽象数据类型Polynomial一元多项式的实现typedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;// 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct _LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;#define DestroyPolyn DestroyList#define PolynLength ListLength// 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置// 若无前驱,则返回NULLPosition PriorPos(LinkList L,Link p){Link q;q=L.head->next;if(q==p) // 无前驱return NULL;else{while(q->next!=p) // q不是p的直接前驱q=q->next;return q;}}// 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回1;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。
并返回0。
(用于一元多项式)int LocateElemP(LinkList L,ElemType e,Position *q,int(*compare)(ElemType,ElemType)){Link p=L.head,pp;do{pp=p;p=p->next;}while(p&&(compare(p->data,e)<0)); // 没到表尾且p->data.expn<e.expn if(!p||compare(p->data,e)>0) // 到表尾或compare(p->data,e)>0{*q=pp;return 0;}else // 找到{*q=p;return 1;}}// h指向L的一个结点,把h当做头结点,删除链表中的第一个结点并以q返回。
// 若链表为空(h指向尾结点),q=NULL,返回0int DelFirst(LinkList *L,Link h,Link *q){*q=h->next;if(*q) // 链表非空{h->next=(*q)->next;if(!h->next) // 删除尾结点(*L).tail=h; // 修改尾指针(*L).len--;return 1;}elsereturn 0; // 链表空}// 分配由p指向的值为e的结点,并返回1;若分配失败。
则返回0int MakeNode(Link *p,ElemType e){*p = (Link)malloc(sizeof(LNode)); //动态分配一个Link空间if(!*p)return 0;(*p)->data = e; // 赋值return 1;}// 释放p所指结点void FreeNode(Link *p){free(*p); //老规矩,先释放存储空间,然后置空*p=NULL;}// h指向L的一个结点,把h当做头结点,将s所指结点插入在第一个结点之前// 头结点没有数据域,而第一个结点是h->nextint InsFirst(LinkList *L,Link h,Link s){s->next = h->next;h->next=s;if(h==(*L).tail) // 如果h指向尾结点(*L).tail=h->next; // 修改尾指针(*L).len++;return 1;}// 按有序判定函数compare()的约定,将值为e的结点插入或合并到升序// 链表L的适当位置int OrderInsertMerge(LinkList *L,ElemType e,int(* compare)(term,term)) {Position q,s;if(LocateElemP(*L,e,&q,compare)) // L中存在该指数项{q->data.coef+=e.coef; // 改变当前结点系数的值if(!q->data.coef) // 系数为0{// 删除多项式L中当前结点s = PriorPos(*L,q); // s为当前结点的前驱if(!s) // q无前驱s=(*L).head;DelFirst(L,s,&q);FreeNode(&q);}return 1;}else // 生成该指数项并插入链表if(MakeNode(&s,e)) // 生成结点成功{InsFirst(L,q,s);return 1;}else // 生成结点失败return 0;}// 依a的指数值<、=或>b的指数值,分别返回-1、0或+1 // CreatPolyn()的实参int cmp(term a,term b){if(a.expn==b.expn)return 0;elsereturn (a.expn-b.expn)/abs(a.expn-b.expn); }// 构造一个空的线性链表int InitList(LinkList *L){Link p;p=(Link)malloc(sizeof(LNode)); // 生成头结点if(p){p->next=NULL;//将头尾结点都分配好,并将其下一结点置空(*L).head=(*L).tail=p;(*L).len=0; //初始为0return 1;}else // 分配失败返回return 0;}// 算法2.22 P42// 输入m项的系数和指数,建立表示一元多项式的有序链表Pvoid CreatPolyn(polynomial *P,int m){Position q,s;term e;int i;InitList(P);printf("请依次输入%d个系数,指数:(空格)\n",m);for(i=1;i<=m;++i){// 依次输入m个非零项(可按任意顺序)scanf("%f%d",&e.coef,&e.expn);// 当前链表中不存在该指数项,cmp是实参if(!LocateElemP(*P,e,&q,cmp))if(MakeNode(&s,e)) // 生成结点并插入链表InsFirst(P,q,s);}}// 返回线性链表L中头结点的位置Position GetHead(LinkList L){return L.head;}// 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置// 若无后继,则返回NULLPosition NextPos(Link p){return p->next;}// 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值ElemType GetCurElem(Link p){return p->data;}// 将指针s(s->data为第一个数据元素)所指(彼此以指针相链,以NULL结尾)的// 一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新// 的尾结点int Append(LinkList *L,Link s){int i=1; //记录s为头的串结点个数(*L).tail->next=s; //尾结点指向swhile(s->next){s=s->next;i++;}(*L).tail=s;(*L).len+=i;return 1;}// 若线性链表L为空表,则返回1,否则返回0int ListEmpty(LinkList L){if(L.len)return 0;elsereturn 1;}// 将线性链表L重置为空表(头尾结点相同为空表),并释放原链表的结// 点空间,不释放头尾结点,只是置空而已int ClearList(LinkList *L){Link p,q;if((*L).head!=(*L).tail)// 不是空表{p=q=(*L).head->next;(*L).head->next=NULL;while(p!=(*L).tail){p=q->next;free(q);q=p;}free(q);(*L).tail=(*L).head;(*L).len=0;}return 1;}// 销毁线性链表L,L不再存在int DestroyList(LinkList *L){ClearList(L); // 清空链表(头尾结点并没有释放)FreeNode(&(*L).head); //再释放头尾结点(*L).tail=NULL;(*L).len=0;return 1;}// 算法2.23 P43// 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pbvoid AddPolyn(polynomial *Pa,polynomial *Pb){Position ha,hb,qa,qb;term a,b;ha=GetHead(*Pa);hb=GetHead(*Pb); // ha和hb分别指向Pa和Pb的头结点qa=NextPos(ha);qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第一个结点)while(!ListEmpty(*Pa)&&!ListEmpty(*Pb)&&qa){ // Pa和Pb均非空且ha没指向尾结点(qa!=0)a=GetCurElem(qa);b=GetCurElem(qb); // a和b为两表中当前比较元素switch(cmp(a,b)){case -1:ha=qa; // 多项式Pa中当前结点的指数值小qa=NextPos(ha); // ha和qa均向后移一个结点break;case 0:qa->data.coef+=qb->data.coef;// 两者的指数值相等,修改Pa当前结点的系数值if(qa->data.coef==0) // 系数和为0,则删除多项式Pa中当前结点{DelFirst(Pa,ha,&qa);FreeNode(&qa);}elseha=qa;DelFirst(Pb,hb,&qb);FreeNode(&qb);qb=NextPos(hb);qa=NextPos(ha);break;case 1:DelFirst(Pb,hb,&qb); // 多项式Pb中当前结点的指数值小InsFirst(Pa,ha,qb);ha=ha->next;qb=NextPos(hb);}}if(!ListEmpty(*Pb)){(*Pb).tail=hb;Append(Pa,qb); // 链接Pb中剩余结点}DestroyPolyn(Pb); // 销毁Pb}// 另一种多项式加法的算法:Pa=Pa+Pb,并销毁一元多项式Pbvoid AddPolyn1(polynomial *Pa,polynomial *Pb){Position qb;term b;qb=GetHead(*Pb); // qb指向Pb的头结点qb=qb->next; // qb指向Pb的第一个结点while(qb){b=GetCurElem(qb);OrderInsertMerge(Pa,b,cmp);qb=qb->next;}DestroyPolyn(Pb); // 销毁Pb}// 一元多项式系数取反void Opposite(polynomial Pa){Position p;p=Pa.head;while(p->next){p=p->next;p->data.coef*=-1;}}// 多项式减法:Pa=Pa-Pb,并销毁一元多项式Pbvoid SubtractPolyn(polynomial *Pa,polynomial *Pb) {Opposite(*Pb);AddPolyn(Pa,Pb);}// 多项式乘法:Pa=PaPb,并销毁一元多项式Pbvoid MultiplyPolyn(polynomial *Pa,polynomial *Pb) {polynomial Pc;Position qa,qb;term a,b,c;InitList(&Pc);qa=GetHead(*Pa);qa=qa->next;while(qa){a=GetCurElem(qa);qb=GetHead(*Pb);qb=qb->next;while(qb){b=GetCurElem(qb);c.coef=a.coef*b.coef;c.expn=a.expn+b.expn;OrderInsertMerge(&Pc,c,cmp);qb=qb->next;}qa=qa->next;}DestroyPolyn(Pb); // 销毁PbClearList(Pa); // 将Pa重置为空表(*Pa).head=Pc.head;(*Pa).tail=Pc.tail;(*Pa).len=Pc.len;}// 打印输出一元多项式Pvoid PrintPolyn(polynomial P){Link q;q=P.head->next; // q指向第一个结点printf(" 系数指数\n");while(q){printf("%f %d\n",q->data.coef,q->data.expn);q=q->next;}}int main(){polynomial p,q;int m;// 多项式相加printf("两个一元多项式相加\n");//构建一个多项式printf("请输入第一个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&p,m);//构建另一个多项式printf("请输入第二个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&q,m);//多项式相加AddPolyn(&p,&q);printf("两个一元多项式相加的结果:\n");//打印多项式PrintPolyn(p);// 使用另一种多项式相加的方法printf("\n两个一元多项式相加(另一种方法)\n");printf("请输入第三个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&p,m);printf("请输入第四个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&q,m);// 多项式相加的另一种方法AddPolyn1(&p,&q);printf("两个一元多项式相加的结果(另一种方法):\n");PrintPolyn(p);// 多项式相减printf("\n两个一元多项式相减\n");printf("请输入第五个个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&p,m);printf("请输入第六个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&q,m);// 多项式相减SubtractPolyn(&p,&q);printf("两个一元多项式相减的结果:\n");PrintPolyn(p);//多项式相乘printf("\n两个一元多项式相乘\n");printf("请输入第七个个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&p,m);printf("请输入第八个一元多项式的非零项的个数:");scanf("%d",&m);CreatPolyn(&q,m);//多项式相乘MultiplyPolyn(&p,&q);printf("两个一元多项式相乘的结果:\n");PrintPolyn(p);//销毁多项式DestroyPolyn(&p);DestroyPolyn(&q);system("pause");return 0;}/*输出效果:两个一元多项式相加请输入第一个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)1 0 1 1请输入第二个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)-1 0 -2 1两个一元多项式相加的结果:系数指数-1.000000 1两个一元多项式相加(另一种方法)请输入第三个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)1 0 1 1请输入第四个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)-1 0 -2 1两个一元多项式相加的结果(另一种方法):系数指数-1.000000 1两个一元多项式相减请输入第五个个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)1 02 1请输入第六个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)-2 0 -1 1两个一元多项式相减的结果:系数指数3.000000 03.000000 1两个一元多项式相乘请输入第七个个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)1 0 1 1请输入第八个一元多项式的非零项的个数:2 请依次输入2个系数,指数:(空格)1 0 1 1两个一元多项式相乘的结果:系数指数1.000000 02.000000 11.000000 2请按任意键继续. . . */。