实验报告——2 一元稀疏多项式计算器
一元稀疏多项计算器【加法和减法】

Data Structure.实习报告【实习一线性表、堆栈和队列的应用】一元稀疏多项式运算器Xiaohui HuangChina University of Geosciences(Wuhan) , Wuhan,Wuhan , Hubei Province , China ;Email : hxh1994@/hxh20111003570@1.问题描述设计一个一元稀疏多项式简单计算器。
要求为:(1)输入并建立两个多项式;(2)多项式a与b相加,建立和多项式c;(3)多项式a与b相减,建立和多项式d;(4)输出多项式a,b,c,d。
输出格式:比如多项式a为:A(x)=c1x e1+ c2x e2+…+ c m x em,其中,c i 和e i分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<e m。
2.设计◆设计思想我们知道,一个一元多项式可表示为A(x)=a0+a1x+a2x2+⋯+a n x n 其中,a0、a1、a2、…、a n为多项式的系数,惟一确定了这个多项式,而每一项的指数这隐藏在系数a i的序号中了。
那么我们可以使用线性表(a0、a1、a2、…、a n)来表示。
设A=(a0、a1、a2、…、a n),B=(b0、b1、b2、…、b n),则多项式的加法就相当于A+B=C,其中,C=(c0、c1、c2、…、c n),其中c i=a i+b i。
◆概要设计从设计思想我们可以得知我们这个程序的主要功能是模拟计算器的加法和减法功能。
那么问题就归结于创建两个线性表,通过线性表相对应元素的相加减来模拟计算器的功能。
现在的问题是:我们应该选择什么类型的线性表、我们应该选择线性表的哪一种存储结构。
通过我们所学习的知识可以知道,我们有线性表、堆栈和队列等来可供选择,而经过考虑后,多项式的建立应该使用一种线性结构,故我们选择线性表。
另一方面,我们知道一个多项式并不是每一项的系数是存在的,比如一个只含有两个项的多项式,其中,一个项的指数是1,一个项的指数是1000,如果此时我们采用线性表的顺序存储结构,那么会极大的浪费内存空间。
数据结构实习报告——一元稀疏多项式运算器的设计

数据结构实习报告——一元稀疏多项式运算器的设计一、引言在计算机科学领域中,数据结构是研究数据组织、存储和管理的关键概念之一。
在本次实习中,我设计并实现了一个一元稀疏多项式运算器,旨在使用适当的数据结构和算法来高效地进行多项式的加法、减法和乘法运算。
本报告将详细介绍该运算器的设计思路、算法实现以及性能评估。
二、设计思路1. 多项式的表示在设计多项式运算器时,首先需要确定多项式的表示方法。
为了高效地处理稀疏多项式,我选择使用链表作为基本数据结构。
每个节点包含多项式的系数和指数,并通过指针连接在一起形成链表。
这种表示方法可以有效地处理稀疏多项式,减少了不必要的空间浪费。
2. 多项式的输入和输出为了方便用户输入和输出多项式,我设计了简单的交互界面。
用户可以通过命令行输入多项式的系数和指数,并选择进行的运算操作。
运算结果将直接在命令行中输出。
三、算法实现1. 多项式的加法多项式的加法是指将两个多项式相加得到一个新的多项式。
为了实现这个功能,我设计了一个算法如下:- 创建两个空的链表,分别表示两个多项式。
- 逐个读取用户输入的系数和指数,并将其插入到相应的链表中。
- 对两个链表进行遍历,根据指数的大小关系进行合并操作。
- 将合并后的结果链表输出。
2. 多项式的减法多项式的减法是指将一个多项式减去另一个多项式得到一个新的多项式。
为了实现这个功能,我设计了一个算法如下:- 创建两个空的链表,分别表示两个多项式。
- 逐个读取用户输入的系数和指数,并将其插入到相应的链表中。
- 对第二个链表中的每个节点的系数取相反数。
- 对两个链表进行遍历,根据指数的大小关系进行合并操作。
- 将合并后的结果链表输出。
3. 多项式的乘法多项式的乘法是指将两个多项式相乘得到一个新的多项式。
为了实现这个功能,我设计了一个算法如下:- 创建一个空的链表,表示乘法结果。
- 逐个读取用户输入的系数和指数,并将其插入到链表中。
- 对第一个链表中的每个节点,与第二个链表中的每个节点进行乘法运算,并将结果插入到结果链表中。
实验报告——2一元稀疏多项式计算器

(3)(1+x+x +x +x +x ) +( -x-x )
(4)(x+x2+x3)+0
(5)(x+x3)-(-x-x-3)
⑹(x+x2+x3)+0
三、实验内容
主要算法设计
typedef struct Node
{
float coef;
int in dex;
struct Node *n ext;
{
LinkList *pc;
int flag=0;
while(flag==0)
{
if(pb->next==NULL)
flag=1;
else
{
pb=pb->next;
pc=(LinkList *)malloc(sizeof(LinkList));
pc->coef=-pb->coef; pc->index=pb->index; pc->next=NULL;
主冃主冃斗冃主
2,1
5,B -3.1,11
项式b的项数;3 7,0-5.8ffl-ltb疏多项式计算器
3
»■快I列歹序序1数2数弓整t(展lt4L2^^bm、」丄-TrJ二上M?E--uMr.选项选项选现岀岀岀4-.冷丄#-W
3
nV为===*
,2,1
,7,
请输更入塾项更蠢製扌吐 亟人第2项更薑癒吋 备入第咗项的系数却1逼△鄴项翌謎I诰倉△第2项更舍魅吐亟人>项 聶入第4项的系数稲
Insert(pc,head);
}
}
return head;
void main()
云南大学软件学院数据结构实验二实验报告——多项式计算器

云南大学软件学院数据结构实验报告2010秋季学期(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)学号:姓名:专业:指导老师:实验难度A□B□ C □承担任务(难度为C时填写)指导教师评分(签名)【实验题目】实验2. 线性表及其应用【问题描述】用C或C++语言设计并实现一个一元稀疏多项式的简单计算器。
【基本要求】一元稀疏多项式简单计算器的基本功能是:1、输入并建立多项式2、输出多项式,序列按指数降序排列3、多项式A(x)和B(x)相加,并建立多项式A(x)+B(x)4、多项式A(x)和B(x)相减,并建立多项式A(x)-B(x)5、给定 x 的值,计算多项式6、多项式A(x)和B(x)相乘,建立多项式A(x)*B(x) (* 选做,作为难度B的操作)【CDIO项目要求】1、有完整的CDIO四个阶段描述2、有友好美观的操作界面3、有软件使用说明或帮助文档4、项目成员分工明确,团结协作【实现提示】一、【实验构思(Conceive)】(10%)本实验通过C语言实现了多项式加法、减法、乘法、多项式求导、多项式积分的功能。
利用了冒泡排序的算法作为排序的核心算法。
运用了高等数学中多项式的求导积分的知识。
二、【实验设计(Design)】(15%)本程序定义了抽象数据结构listnode,用于存储多项式的系数和指数并存储指向下一个listnode的指针来构成链表。
本程序包含如下*个函数:Main函数:调用input函数—>调用bubble_sort函数—>调用operplus函数—>调用oper_minus函数—>调用oper_mul函数—>调用oper_dy函数—>调用oper_jifen 函数。
Oper_plus函数:将两个链表的相应项系数相加,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
Oper_minus函数:将两个链表的相应项系数相减,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
数据结构实习报告——一元稀疏多项式运算器的设计

数据结构实习报告——一元稀疏多项式运算器的设计一、引言在计算机科学领域中,数据结构是构建各种算法和程序的基础。
本次实习项目旨在设计一个一元稀疏多项式运算器,通过合理的数据结构和算法实现多项式的加法、减法和乘法运算,以及求导和求值等功能。
本文将详细介绍该运算器的设计思路、数据结构选择、算法实现和性能优化等方面。
二、设计思路为了实现一元稀疏多项式的运算,我们需要选择合适的数据结构来存储和操作多项式的系数和指数。
考虑到多项式中只有少数系数非零,我们可以使用链表来表示多项式,每个节点存储一个非零系数和对应的指数。
这样可以节省空间,并且方便插入和删除操作。
三、数据结构选择在设计中,我们选择了一个单向链表作为多项式的数据结构。
链表节点的定义如下:```struct Node {int coefficient; // 系数int exponent; // 指数Node* next; // 下一个节点指针};```链表的头节点指针指向第一个非零项,便于遍历和操作。
四、算法实现1. 多项式的输入用户可以通过标准输入方式输入多项式的系数和指数,我们通过读取用户输入的系数和指数,并根据其大小构建链表。
2. 多项式的加法和减法运算多项式的加法和减法运算可以通过遍历两个多项式的链表,并根据指数的大小进行合并操作。
具体的实现可以使用双指针的方式,分别指向两个链表的当前节点,比较指数的大小,然后将较小的节点插入到结果链表中,并将指针向后移动。
3. 多项式的乘法运算多项式的乘法运算可以通过遍历两个多项式的链表,并将每一项相乘得到新的项,然后将新的项插入到结果链表中。
具体的实现中,可以使用一个嵌套的循环,先遍历一个多项式的链表,再遍历另一个多项式的链表,将每一项相乘,并根据指数的大小插入到结果链表中。
4. 多项式的求导和求值多项式的求导可以通过遍历链表,将每一项的系数乘以指数,并将指数减一得到新的项。
多项式的求值可以通过遍历链表,将每一项的系数乘以变量的值的指数次方,并累加得到结果。
一元稀疏多项式实验报告(罗忠霖)

集美大学计算机工程学院实验报告课程名称: 数据结构与算法班级:计算1013 实验成绩:指导老师:杨艳华姓名:罗忠霖实验名称:一元稀疏多项式计算器学号:2010810072 上机时间2011年10月20号编号:03 组号;12 上机完成时间:2学时一.目的(本次试验所涉及并要求掌握的知识点)本次实习的主要目的在于帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用为重点。
二.实验内容与设计思想1.问题描述设计一个一元稀疏多项式简单计算器2.基本要求一元稀疏多项式简单计算器的基本功能:(1)输入并建立多项式;(2)输出多项式,输出的形式为整数序列:n,c1,e1,c2,,en,期中n为多项式的项数,ci和ei分别为第i 项的系数和指数,系列按指数的降序排列;(3)多项式a和多项式b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;3.程序代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct list{float xishu;//某项的系数int zhishu;//某项的指数struct list * next;}*linklist;void caidan(void);void xianshi(linklist);linklist dx_built(int);linklist dx_jia(linklist,linklist);linklist dx_jian(linklist,linklist);linklist sort(linklist head);main(){int i,a,b;linklist pa,pb,pc1,pc2;caidan();do{printf("\n");printf("请选择你想要的功能0--4\n");scanf("%d",&i);switch(i){case 1: printf("请输入多项式A的项数:\n");scanf("%d",&a);pa=dx_built(a);pa=sort(pa);printf("请输入多项式B的项数:\n");scanf("%d",&b);pb=dx_built(b);pb=sort(pb);break;case 2: printf("多项式A与B的和为:");pc1=dx_jia(pa,pb);xianshi(pc1);break;case 3: printf("多项式A与B的差为:");pc2=dx_jian(pa,pb);xianshi(pc2);break;case 4: printf("多项式A=");xianshi(pa);printf("多项式B=");xianshi(pb);break;case 0: break;}} while(i!=0);printf("你选择了退出操作,欢迎使用!\n");system("pause");// 系统暂停,按任意键键继续flushall();system("cls");}void caidan(void){// 定义菜单函数printf("*************************************************\n");printf("\t一元稀疏多项式计算器\t\n");printf("*************************************************\n");printf("0.退出程序\n");printf("1.建立多项式\n");printf("2.多项式加法\n");printf("3.多项式减法\n");printf("4.多项式输出\n");printf("*************************************************\n"); }// caidanlinklist dx_built(int m){//创建多项式int i;linklist head,p;head=(struct list *)malloc(sizeof(struct list));head->next=NULL;for(i=1;i<=m;i++){p=(struct list *)malloc(sizeof(struct list));printf("(dx,%d)=",i);scanf("%f%d",&p->xishu,&p->zhishu);if(p->xishu==0) //系数为0的时候,删掉该节点free(p);else//系数不为0的时候{p->next =head->next ;head->next =p;}}return head;}linklist sort(linklist head){//指数按降序排列linklist p,q,tail,s;tail=NULL;while(head->next!=tail){p=head;q=p->next;while(q->next!=tail){if(p->next->zhishu<q->next->zhishu){s=q->next;p->next=q->next;q->next=q->next->next;p->next->next=q;q=s;}p=p->next;q=q->next;}tail=q;}return head;}void xianshi(linklist head){linklist q=head->next;int flag=0;//项数计数器if(!q){ //若多项式为空,输出0printf("0\n");return;}while(q){if(q->xishu>0&&flag!=0) putchar('+'); //系数大于0且不是第一项if(q->xishu!=1&&q->xishu!=-1){//系数非1或-1的普通情况printf("%.f",q->xishu);if(q->zhishu==1) putchar('X');else if(q->zhishu) printf("X^%d",q->zhishu);}else{if(q->xishu==1){if(!q->zhishu) putchar('1');else if(q->zhishu==1) putchar('X');else printf("X^%d",q->zhishu);}if(q->xishu==-1){if(!q->zhishu) printf("-1");else if(q->zhishu==1) printf("-X");else printf("-X^%d",q->zhishu);}}q=q->next;flag++;}printf("\n");}linklist dx_jia(linklist pa,linklist pb){/*多项式相加*/linklist p=pa->next ,q=pb->next ,pc,tail,s;//pc用来存储两个多项式的和pc=tail=(struct list *)malloc(sizeof(struct list));while(p!=NULL&&q!=NULL){s=(struct list *)malloc(sizeof(struct list));if(p->zhishu >q->zhishu )//p指数大,则存入pc,p然后后移{s->xishu=p->xishu;s->zhishu=p->zhishu;tail->next =s;tail=s;p=p->next;}else{ if(p->zhishu <q->zhishu)//q指数大,则存入pc,q然后后移{s->xishu=q->xishu;s->zhishu=q->zhishu;tail->next =s;tail=s;q=q->next;}else //指数相等时{ if(p->xishu +q->xishu==0 )//系数和为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}else //系数和不为0,则存入pc中,q,p后移{s->xishu=p->xishu+q->xishu ;s->zhishu=p->zhishu;tail->next=s;tail=s;p=p->next;q=q->next;}}}}if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;return pc;}linklist dx_jian(linklist pa,linklist pb){/*多项式相减*/linklist p=pa->next ,q=pb->next ,pc,tail,s;//pc用来存储两个多项式的差pc=tail=(struct list *)malloc(sizeof(struct list));while(p!=NULL&&q!=NULL){s=(struct list *)malloc(sizeof(struct list));if(p->zhishu >q->zhishu )//p指数大,则存入pc,p然后后移{s->xishu=p->xishu;s->zhishu=p->zhishu;tail->next =s;tail=s;p=p->next;}else{ if(p->zhishu <q->zhishu)//q指数大,则把q是系数前加-1再存入pc,q然后后移{s->xishu=-(q->xishu);s->zhishu=q->zhishu;tail->next =s;tail=s;q=q->next;}else //指数相等时{ if(p->xishu -q->xishu==0 )//系数差为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}else //系数差不为0,则存入pc中,q,p后移{s->xishu=p->xishu-q->xishu ;s->zhishu=p->zhishu;tail->next=s;tail=s;p=p->next;q=q->next;}}}}if(p ==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;return pc;}三.实验使用环境(本实验所使用的平台和相关的软件)Microsoft Visual C++ 6.0四.实验步骤和调试过程(实验步骤测试数据设计测试结果分析)测试结果:五.实验小结(实验过程中遇到的问题及解决过程.实验体会和收获)1.在编写一元稀疏多项式程序代码的时候,为了实现这个程序,我采取了模块化设计,针对每个功能,我使用一个函数去实现它;2.在建立多项式的时候,我使用了单向链表去实现,在建立的时候,我把系数为0时候,这个节点给删掉,if(p->xishu==0) //系数为0的时候,删掉该节点free(p);然而我我这个函数还有个不足的地方,就是当指数相同,系数不同的时候,我没考虑到把它合并,这我以后会改进;2.在主函数里,我采用了调用函数的方式,使界面简洁,但是我刚开始的时候没有准确地调用函数,程序运行失败,并且我把排序函数插入到现实函数里,导致了一个未知的错误,程序失败了,后来我把排序函数加到了建立的地方,printf("请输入多项式A的项数:\n");scanf("%d",&a);pa=dx_built(a);pa=sort(pa);3,这个程序我花了最多时间的地方就是加法算法,我使用了三条链,pa.pb,pc,我把和的结果给存放在pc中,当和为0的时候我不存入pc,if(p->xishu +q->xishu==0 )//系数和为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}并且我还考虑了当两个多项式项数不相等的时候,用了一下这条语句去实现if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;,但是我刚开始的时候,if(p->next==NULL),这个加法没有成功,最后发现了这个错误,运行成功;4.我在编写这个程序的时候,很好地复习了c语言的知识,并且能够对链表这个章节的知识有很好的巩固;。
数据结构课程设计_一元稀疏多项式计算器

数据结构实验报告——一元稀疏多项式计算器安子烨PB12203079实验目的实现一元多项式的简单运算功能,掌握线性表的知识,提高编程能力。
功能清单1.一元多项式创建2.显示一元多项式3.复制一元多项式4.多项式加法5.多项式减法6.修改一元多项式7.删除一元多项式8.销毁记录实验设计该多项式计算器以菜单驱动的形式实现上述各运算功能。
最多可支持十条记录,分别用指针数组引导存储于十个不同的位置。
以下为程序的部分源代码。
#include<stdio.h>#include<math.h>#include<stdlib.h>typedef struct LinkList{double coef;int expn;LinkList *next;}LNode;void CreatPolyn(LinkList **h)//创建多项式{LinkList *q=NULL, *w=NULL, *p=NULL;double m=0; int n=0;(*h)=(LinkList *)malloc(sizeof(LinkList));(*h)->coef=0; (*h)->expn=0; (*h)->next=NULL;printf("请输入X的系数和指数,当系数为零时结束创建\n");scanf("%lf%d",&m,&n);while(m!=0){q=(LinkList *)malloc(sizeof(LinkList));q->coef=m; q->expn=n; q->next=NULL;if((*h)->next==NULL){if(q->expn==(*h)->expn) (*h)->coef+=q->coef;else if((*h)->expn>q->expn) {q->next=(*h); *h=q; } else (*h)->next=q;}else{for(w=(*h);w->next!=NULL;w=w->next){if(q->expn==w->expn){w->coef+=q->coef;break;}else if((w->expn>q->expn)&&(w==*h)){q->next=(*h);(*h)=q;break;}else if((w->expn<q->expn)&&(w->next->expn>q->expn)){q->next=w->next;w->next=q;break;}}if(w->next==NULL){if(w->expn==q->expn) w->coef+=q->coef;else if(w->expn<q->expn) w->next=q;}}printf("请输入X的系数和指数,当系数为零时结束创建\n");scanf("%lf%d",&m,&n);}}void PrintPolyn(LinkList *p, int i)//打印多项式{printf("第%d个多项式是:",i);while(p!=NULL){if((p->coef)>0) printf("+%lf*X^%d",p->coef,p->expn);else if((p->coef)<0) printf("%lf*X^%d",p->coef,p->expn); p=p->next;}printf("\n");}void CopyPolyn(LinkList **M, LinkList **N)//多项式复制{LinkList *p=NULL, *q=NULL, *w=NULL;(*N)=(LinkList *)malloc(sizeof(LinkList));(*N)->coef=(*M)->coef; (*N)->expn=(*M)->expn; (*N)->next=NULL;for(w=(*N),p=(*M)->next;p!=NULL;p=p->next){q=(LinkList *)malloc(sizeof(LinkList));q->coef=p->coef; q->expn=p->expn; q->next=p->next;w->next=q; w=w->next;}}void AddPolyn(LinkList *M, LinkList *N, LinkList **X)//多项式加法{LinkList *p=NULL, *q=NULL, *w=NULL, *z=NULL;(*X)=(LinkList *)malloc(sizeof(LinkList));(*X)->coef=0; (*X)->expn=0; (*X)->next=NULL;for(p=M,q=N,w=(*X);(p!=NULL)&&(q!=NULL);){z=(LinkList *)malloc(sizeof(LinkList));if(p->expn<q->expn){z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}else if(p->expn>q->expn){z->coef=q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}else if(p->expn==q->expn){z->coef=p->coef+q->coef; z->expn=p->expn; z->next=NULL;p=p->next; q=q->next; w->next=z; w=w->next;}}if(p==NULL){for(;q!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}}else if(q==NULL){for(;p!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}}for(w=(*X);w!=NULL;w=w->next){printf("%lf %d\n",w->coef,w->expn);}}void SubtractPolyn(LinkList *M, LinkList *N, LinkList **X)//多项式减法{LinkList *p=NULL, *q=NULL, *w=NULL, *z=NULL;(*X)=(LinkList *)malloc(sizeof(LinkList));(*X)->coef=0; (*X)->expn=0; (*X)->next=NULL;for(p=M,q=N,w=(*X);(p!=NULL)&&(q!=NULL);){z=(LinkList *)malloc(sizeof(LinkList));if(p->expn<q->expn){z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}else if(p->expn>q->expn){z->coef=-q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}else if(p->expn==q->expn){z->coef=p->coef-q->coef; z->expn=p->expn; z->next=NULL;p=p->next; q=q->next; w->next=z; w=w->next;}}if(p==NULL){for(;q!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=-q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}}else if(q==NULL){for(;p!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}}/*for(w=(*X);w!=NULL;w=w->next){printf("%lf %d\n",w->coef,w->expn);}*/}void ValuePolyn(LinkList *h, double x)//多项式求值{double sum=0, a=0;while(h!=NULL){a=pow(x,h->expn);sum=sum+(h->coef)*a;h=h->next;}printf("所求多项式的值为%lf\n",sum);}void DeletePolyn(LinkList **h){LinkList *p=(*h)->next; (*h)=NULL;while(p!=NULL){free(*h);(*h)=p;p=p->next;}}void RevisePolyn(LinkList **h, int i){int n=0;int choose=0;double m=0;LinkList *q=NULL, *w=NULL;PrintPolyn((*h),i);printf("请输入你想执行的操作代号(添加:1;修改:2;删除:3)\n");scanf("%d",&choose);switch(choose){case 1:{printf("输入你想要添加项的系数和次数\n");scanf("%lf%d",&m,&n);q=(LinkList *)malloc(sizeof(LinkList));q->coef=m; q->expn=n; q->next=NULL;for(w=(*h);w->next!=NULL;w=w->next){if((w->expn>q->expn)&&(w==*h)){q->next=(*h);(*h)=q;break;}else if((w->expn<q->expn)&&(w->next->expn>q->expn)) {q->next=w->next;w->next=q;break;}}if(w->expn<n) w->next=q;break;}case 2:{printf("输入你想要修改项的系数和次数\n");scanf("%lf%d",&m,&n);for(w=(*h);w!=NULL;w=w->next){if(w->expn==n) w->coef=m;}printf("未找到该项。
一元稀疏多项式简单的计算器

1.一元稀疏多项式简单的计算器(实验类型:综合型)1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器2)实验要求:✧采用单链表存储结构一元稀疏多项式✧输入并建立多项式✧输出多项式✧实现多项式加、减运算3) 实现提示:以两个多项式相加为例✧结果多项式另存✧扫描两个相加多项式,若都未检测完:⏹若当前被检测项指数相等,系数相加,若结果未变成0,则将结果插入到结果多项式。
⏹若当前被检测项指数不等,则将指数较小者插入到结果多项式。
若有一个多项式已检测完,则将另一个多项式剩余部分直接连接到结果多项式。
4.一元稀疏多项式简单的计算器(实验类型:综合型)#include<stdio.h>#include<stdlib.h>typedef struct{float coef;//系数int expn;//指数} Term;typedef struct ploynomial{Term term;ploynomial* next;} ploynomial,*LinkList;void InitList(LinkList&L){//初始化链表L= (ploynomial*)malloc(sizeof(ploynomial));//头结点L->term.coef=0.0;L->term.expn=-1; L->next=NULL;}int cmp(Term a,Term b){//比较结点的系数大小函数if(a.expn>b.expn) return -1;else if(a.expn==b.expn) return 0; else return 1;}void insertNode(LinkList&L,Term e){//将结点插入多项式链表的适当位置,可以同时起到创建链表和多项式相加的功能ploynomial* q=L;while(q->next!=NULL){if(cmp(q->next->term,e)<0)//如果当前结点q的下一个结点的指数大于要插入的结点的指数q=q->next;//q指向下一个结点else break;//此时,q.term.expn>e.expn>=q->next->term.expn }if(q->next!=NULL&&cmp(q->next->term,e)==0) //指数相同,系数相加{q->next->term.coef+=e.coef;}else{ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));node->term.coef=e.coef;node->term.expn=e.expn;if(q->next==NULL)node->next=NULL; //如果q结点为尾结点,则node的指针域设为NULLelsenode->next=q->next; //否则node的指针域指向q的下一个结点q->next=node;//将node结点插入链表中}}void CreatPolyn(LinkList&L,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表L Term e;InitList(L);for(int i=1; i<=m; i++){printf("\n第%d项的系数和指数:",i);scanf("%f%d",&e.coef,&e.expn);insertNode(L,e);}}void addPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1+L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next) //将L2的每一项插入到L 中{insertNode(L,q->term);}}void SubtracatPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1-L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next){q->term.coef = -(q->term.coef); //把系数变成相反数,再进行相加操作,即为L1-L2insertNode(L,q->term);//将L2的每一项插入到L中}}void multiplyPolyn(LinkList&L,LinkList L1,LinkList L2) {//用L返回L1*L2的结果ploynomial *p,*q;Term term;term.coef=0.0;term.expn=0;for(q=L1->next; q!=NULL; q=q->next){for(p=L2->next; p!=NULL; p=p->next){term.coef=(q->term.coef)*(p->term.coef);//系数相乘term.expn=(q->term.expn)+(p->term.expn);// 指数想加insertNode(L,term);}}}void derivativePolyn(LinkList&L,LinkList L1){//用L返回L1的导数ploynomial *p;Term term;for(p=L1->next; p!=NULL; p=p->next){if(p->term.expn==0){ continue;//指数为0时,导数为0 ,跳过此次循环}else{ term.coef=(p->term.coef)*(p->term.expn); //系数乘以指数term.expn=(p->term.expn)-1;//指数减一insertNode(L,term);}}}void visitList(LinkList L){//以类数学表达式的形式打印输出一元多项式L,//即指数或者系数为1的情况下省略1ploynomial* q=L;int flag;while(q->next!=NULL){q=q->next;flag=1;if(q->term.coef==0) continue;//系数为0 不输出if(q->term.expn==0&&flag==1) //指数为1{if(q->term.coef>0)printf("+%.2f",q->term.coef);elseprintf("%.2f",q->term.coef);flag=0;}if((q->term.coef==1||q->term.coef==-1)&&flag==1)//系数为1{if(q->term.expn==1){ if(q->term.coef==1)printf("+X"); elseprintf("-X");}else{if(q->term.coef==1)printf("+X^%d",q->term.expn); elseprintf("-X^%d",q->term.expn); } flag=0;}if(flag==1){ if(q->term.coef>0)printf("+%.2fX^%d",q->term.coef,q->term.expn);elseprintf("%.2fX^%d",q->term.coef,q->term.expn);} } printf("\n");}int main(){LinkList L1,L2; int n1,n2;printf("请输入多项式L1的项数:");scanf("%d",&n1);CreatPolyn(L1,n1);printf("请输入多项式L2的项数:");scanf("%d",&n2);CreatPolyn(L2,n2);printf("\n多项式L1:");visitList(L1);printf("\n多项式L2: ");visitList(L2);LinkListadd,sub,multiply,derivative1,derivative2;InitList(ad d);InitList(sub);InitList(multiply);InitList(derivative1);InitList(derivative2);derivativePol yn(derivative1,L1);derivativePolyn(derivative2,L2);printf("\nL1的导数:");visitList(derivative1);printf("\nL2的导数:");visitList(derivative2);addPolyn(add,L1,L2);SubtracatPolyn(sub,L1,L2);multiplyPolyn(multiply ,L1,L2);printf("\nL1 + L2: ");visitList(add);printf("\nL1 - L2: ");visitList(sub);printf("\nL1 * L2: ");visitList(multiply);}实验心得:无。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华北水利水电学院一元稀疏多项式计算器实验报告2010~2011学年第一学期 09 级计算机科学与技术专业班级: 2009119 学号: 200911902 姓名:万婷婷一、实验目的设计一个医院稀疏多项式简单计算器熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用二、实验要求a)输入并建立多项式b)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci ,ei分别为第i项的系数和指数。
序列按指数降序排列。
c)多项式a和b相加,建立多项式a+b,输出相加的多项式。
d)多项式a和b相减,建立多项式a-b,输出相减的多项式。
用带表头结点的单链表存储多项式。
测试数据:(1) (2x+5x8-3.1x11)+(7-5x8+11x9)(2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)(3)(1+x+x2 +x3 +x4 +x5)+( -x3- x4)(4)(x+x2+x3)+0(5)(x+x3)-(-x-x-3)(6) (x+x2 +x3 )+0三、实验内容主要算法设计typedef struct Node{float coef;int index;struct Node *next;}LinkList;本程序涉及到多项式的建立、多项式的输出、两个多项式的相加减。
用带头结点的单链表存储多项式;程序中共定义了5个函数:void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中LinkList *Creat_L(LinkList *head,int m)//创建一个链表,项数为m void Printf(LinkList *L)LinkList *ADDlist(LinkList *head,LinkList *pb)LinkList *MinusList(LinkList *head,LinkList *pb)四、程序源代码#include<iostream.h>#include<malloc.h>#include<stdio.h>#include<stdlib.h>typedef struct Node{float coef;int index;struct Node *next;}LinkList;void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中{LinkList *q1,*q2;int flag=0;q1=h;if(p->coef==0)free(p);else{if(q1->next==NULL){q1->next=p;}else{q2=q1->next;while(flag==0){if(p->index<q2->index){if(q2->next==NULL){q2->next=p;flag=1;}else{q1=q2;q2=q2->next;}}elseif(p->index>q2->index){p->next=q2;q1->next=p;flag=1;}else{q2->coef=p->coef+q2->coef;if(q2->coef==0){q1->next=q2->next;free(q2);}flag=1;free(p);}}}}}LinkList *Creat_L(LinkList *head,int m)//创建一个链表,项数为m {int i;LinkList *q;head=(LinkList *)malloc(sizeof(LinkList));head->next=NULL;for(i=1;i<=m;i++){q=(LinkList *)malloc(sizeof(LinkList));q->next=NULL;printf("请输入第%d项的系数和指数:",i);scanf("%f,%d",&q->coef,&q->index);Insert(q,head);}return head;}void Printf(LinkList *L){LinkList *p,*q,*pa;int i=0;p=L->next;q=L->next;if(p==NULL){printf("0\n");return;}while(p){p=p->next;i++;}printf("%d,",i);while(q){printf("%g,",q->coef);printf("%d,",q->index);q=q->next;}}LinkList *ADDlist(LinkList *head,LinkList *pb) {LinkList *pc;int flag=0;while(flag==0){if(pb->next==NULL)flag=1;else{pb=pb->next;pc=(LinkList *)malloc(sizeof(LinkList));pc->coef=pb->coef;pc->index=pb->index;pc->next=NULL;Insert(pc,head);}}return head;}LinkList *MinusList(LinkList *head,LinkList *pb) {LinkList *pc;int flag=0;while(flag==0){if(pb->next==NULL)flag=1;else{pb=pb->next;pc=(LinkList *)malloc(sizeof(LinkList));pc->coef=-pb->coef;pc->index=pb->index;pc->next=NULL;Insert(pc,head);}}return head;}void main(){int i,m,n;LinkList *pa=0,*pb=0,*pc;while(1){system("cls");printf("................欢迎使用一元稀疏多项式计算器..............\n");printf(" 请输入多项式a的项数:");scanf("%d",&m);pa=Creat_L(pa,m);printf(" 请输入多项式b的项数:");scanf("%d",&n);pb=Creat_L(pb,n);printf("................欢迎使用一元稀疏多项式计算器..............\n"); printf(" 0.退出系统 \n");printf(" 1.输出多项式a \n");printf(" 2.输出多项式b \n");printf(" 3.输出多项式a+b \n");printf(" 4.输出多项式a-b \n");while(1){printf("\n 请选择操作:");scanf("%d",&i);switch(i){case 0:return;case 1:{printf(" 输出多项式a的整数序列为:");Printf(pa);break;}case 2 :{printf(" 输出多项式b的整数序列为:");Printf(pb);break;}case 3:{pc=ADDlist(pa,pb);printf(" 输出多项式a+b的整数序列为:");Printf(pc);break;}case 4:{pc=MinusList(pa,pb);printf(" 输出多项式a-b的整数序列为:");Printf(pc);break;}default:printf("\n 输入有误,请重新输入:\n");}}}}五、运行结果六、小结(不少于100字)虽然数据结构是一门公认的比较难的课程,自己学起来也觉得有些吃力,但在本次课程设计之前,我系统地把教科书复习了一遍,大大加深了对各种数据结构的理解,运用起来更加自如。
不断地翻阅各种参考书,以及在老师和同学的帮助下,基本上考虑到了所有的边界情况,反复测试各种类型的数据,强化程序的健壮性,最终顺利完成了本次课程设计。
虽然课程设计做的不够完善,但在设计的过程中受益匪浅,通过查资料等学到了很多以前不知道或不太会应用的知识,对单向链表的使用有了更深刻的了解和掌握,因为多项式的计算要求用单向链表来实现,所以在做课程设计之前通过网上找资料,查参考书及问辅导老师等对单向链表的使用比以前掌握的更加到位,并且能够灵活运用,通篇几乎用的都是单向链表,这是受益的一大重点。