fname=数据结构课程设计报告一元多项式的计算

合集下载

数据结构综合实验报告_一元多项式

数据结构综合实验报告_一元多项式

目录1 设计内容和要求 (1)1.1设计要求 (1)1.2设计内容 (1)2 概要设计 (1)2.1程序主要流程 (1)3 详细设计 (3)3.1源程序 (3)4 调试分析 (8)5 总结 (9)6 致谢 (10)参考文献 (11)1 设计内容和要求1.1 设计要求编写一个实现多项式相加和相减的程序。

1、首先,根据键盘输入的一元实系数多项式的系数与指数序列,对多项式进行初始化,并按未知数x的降幂形式输出多项式的合理表示。

2、对于从键盘输入的任意两个一元多项式,正确计算它们的和以及差的多项式,并输出结果。

1.2 设计内容利用单链表表示一元多项式,然后实现各个项的系数和指数的输入,并且进行建立和输出,以及实现各个一元多项式之间的相加和相乘的操作。

2 概要设计实现的方法是先定义多项式结点的结构,该多项式每个结点由三个元素:输入的系数、输入的指数、以及指向下一个结点的指针构成。

该链表采用链式存储结构。

然后通过多次的输入,依次得到两个一元多项式的各个项的系数与指数。

该输入以零结尾。

然后通过对结点的判断是否为零后,进行相加或者终止的操作。

再初始化一个链表LC,将LC的各项系数和指数的指针指向LA+LB所得的结果的值,完成了最后的输出。

2.1程序主要流程建立链表,将多项式的系数与数指数作为链表节点的数据;指示输入两个多项式的数据,分别存在LA与LB中;利用Getlength(PotyNode *L)函数计算出LA与LB的表长;使用循环语句进行两链表的相应数据相加,并将所得到的新链表存放到LC中;打印输出。

如图2-1就是程序主流程图。

在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。

要求可以按照降指数次序进行排列,结合数据结构中排序的相关知识,运用相应函数实现,实现两个多项式的加减运算。

在此要建立多项式运算的相关规则。

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

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

一元多项式的计算一、 需求分析建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果二、 概要设计存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。

基本算法: 1、输入输出(1)功能:将要进行运算的多项式输入输出。

(2)数据流入:要输入的多项式的系数与指数。

(3)数据流出:合并同类项后的多项式。

(4)程序流程图:多项式输入流程图如图1所示。

(5)测试要点:输入的多项式是否正确,若输入错误则重新输入开始 申请结点空间输入多项式各项的系数 x, 指数 y输出已输入的多项式合并同类项结束否是是否输入正确图表 12、多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图表 2开始 定义存储结果的空链 r是否输出存储多项式的和的链r结束 是 否同指数项系数相加后存入r 直接把p 中各项存入r直接把q 中各项存入r存储多项式2的空链Q 是否为空存储多项式1的空链P 是否为空合并同类项3、多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图3所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

开始定义存储结果的空链是否合并同类项结束是 否同指数项系数相加后存入r把p 中各项系数改变符号后存入直接把q 中各项存入r存储多项式2的空链Q 是否为空 存储多项式1的空链P 是否为空输出存储多项式图表 3三、详细设计#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct Polynomial{float coef;int expn;struct Polynomial *next;}*Polyn,Polynomial;/**************合并同类项********************/ void Insert(Polyn p,Polyn h){if(p->coef==0) //系数为0的话释放结点free(p);else //如果系数不为0{Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn)//查找插入位置{q1=q2;q2=q2->next;}if(q2&&p->expn==q2->expn)//将指数相同相合并{q2->coef+=p->coef;free(p);if(!q2->coef) //系数为0的话释放结点{q1->next=q2->next;free(q2);}}else{ //指数为新时将结点插入p->next=q2;q1->next=p;}}}/*****************合并同类项,并按升幂排序*****************/ Polyn HeBing(Polyn &L){Polyn p1,p2,p3,p4,p5,p6;float t1;int t2;p1=L->next;while(p1!=NULL) //非递减顺序排列{p2=p1->next;while(p2!=NULL){if(p1->expn>p2->expn){t1=p1->coef;t2=p1->expn;p1->coef=p2->coef;p1->expn=p2->expn;p2->coef=t1;p2->expn=t2;}p2=p2->next;}p1=p1->next;}p3=L->next;while(p3!=NULL) //合并同类项{p4=p3->next;while(p4!=NULL){if(p3->expn==p4->expn){p3->coef=p3->coef+p4->coef;p3->next=p4->next;free(p4);p4=p3->next;}elsep4=p4->next;}p3=p3->next;}p5=L;while(p5->next!=NULL) //删除零项{p6=p5->next;if(p6->coef==0){p5->next=p6->next;free(p6);}p5=p5->next;}return L;}/*****************建立一个多项式****************/ Polyn CreatPolyn(Polyn &p){Polyn h,s;p=(Polyn)malloc(sizeof(struct Polynomial));if(!p)exit(1);p->coef=0;p->expn=-1;p->next=NULL;h=p;scanf("%f%d",&p->coef,&p->expn);while(p->coef!=0||p->expn!=0)//输入数据{s=(Polyn)malloc(sizeof(struct Polynomial));if(!s)exit(1);s->coef=p->coef;s->expn=p->expn;h->next=s;h=s;scanf("%f%d",&p->coef,&p->expn);}h->next=NULL;HeBing(p);return p;}/******************多项式的销毁***************/ void DestroyPolyn(Polyn p){Polyn q1,q2;q1=p->next;q2=q1->next;while(q1->next){free(q1);q1=q2;q2=q2->next;}}/*************输出多项式**************/void PrintPolyn(Polyn P){Polyn q=P->next;int flag=1;if(!q){putchar('0');printf("\n");return;} //若多项式为空,输出0while (q){if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项if(q->coef!=1&&q->coef!=-1)//系数非1或-1的普通情况{printf("%g",q->coef);if(q->expn==1) putchar('X');else if(q->expn) printf("X^%d",q->expn);}else{if(q->coef==1){if(!q->expn) putchar('1');elseif(q->expn==1) putchar('X');else printf("X^%d",q->expn);}if(q->coef==-1){if(!q->expn) printf("-1");elseif(q->expn==1) printf("-X");else printf("-X^%d",q->expn);}}q=q->next;flag++;}printf("\n");}/************辅助乘法和加法运算*************/int compare(Polyn a,Polyn b){if(a&&b){if(!b||a->expn>b->expn)return 1;elseif(!a||a->expn<b->expn)return -1;elsereturn 0;}elseif(!a&&b)return -1;//a多项式已空,但b多项式非空elsereturn 1;//b多项式已空,但a多项式非空}/*************多项式的加法*********************/ Polyn AddPolyn(Polyn pa,Polyn pb){Polyn qa=pa->next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Polyn)malloc(sizeof(struct Polynomial));hc->next=NULL;headc=hc;while(qa||qb){qc=(Polyn)malloc(sizeof(struct Polynomial));switch(compare(qa,qb)){case 1:{qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}case 0:{qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;}case -1:{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}if(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}HeBing(headc);return headc;}/************多项式的减法*****************/Polyn SubstractPolyn(Polyn pa,Polyn pb){Polyn h=pb;Polyn p=pb->next;Polyn pd;while(p) //将pb的系数取反{p->coef*=-1;p=p->next;}pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next) //恢复pb的系数p->coef*=-1;HeBing(pd);return pd;}/*****************多项式的乘法*********************/Polyn MultiplyPolyn(Polyn pa,Polyn pb){Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Polyn)malloc(sizeof(struct Polynomial));hf->next=NULL;for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){pf=(Polyn)malloc(sizeof(struct Polynomial));pf->coef=qa->coef*qb->coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf);//调用Insert函数以合并指数相同的项}}HeBing(hf);return hf;}/*******************主函数*******************/void main(){Polyn p1, p2, p3, p4, p5;CreatPolyn(p1);CreatPolyn(p2);PrintPolyn(p1);PrintPolyn(p2);p3=AddPolyn(p1, p2);PrintPolyn(p3);p4=SubstractPolyn(p1, p2);PrintPolyn(p4);p5=MultiplyPolyn(p1, p2);PrintPolyn(p5);DestroyPolyn(p1);DestroyPolyn(p2);DestroyPolyn(p3);DestroyPolyn(p4);DestroyPolyn(p5);}四、调试结果1.测试的数据及结果2.算法的时间复杂度及改进算法的时间复杂度:一元多项式的加法运算的时间复杂度为O(m+n),减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。

一元多项式的计算问题-数据结构与算法课程设计报告

一元多项式的计算问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第 2 学期课程数据结构与算法课程设计名称一元多项式的计算问题学生姓名周维学号**********专业班级08计科(2)指导教师王昆仑教授2010年6月题目:(一元多项式的计算问题)要求能够按照指数降序排列建立并输出一元多项式;能够完成两个一元多项式的相加、相减,并将结果输入。

一、问题分析和任务定义1.问题分析本程序关键点是如何将输入的两个多项式相加、相减操作。

①如何将输入的一元多项式按指数的降序排列②如何确定要输入的多项式的项数;③如何将输入的两个一元多项式显示出来。

④如何将输入的两个一元多项式进行相加操作。

⑤如何将输入的两个一元多项式进行相减操作。

本程序是通过链表实现一元多项式的相加减操作。

2、任务定义此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进行相加、相减操作,并将结果输入。

a:输入多项式的项数并建立多项式;b:输出多项式,输出形式分别为浮点和整数序列,序列按指数升序排列;c:多项式a和b相加,建立多项式a+b;d:多项式a和b相减,建立多项式a-b。

e:多项式的输出。

二、数据结构的选择和概要设计:(1)数据结构的选用A:基于链表中的节点可以动态生成的特点,以及链表可以灵活的添加或删除节点的数据结构,为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;例如,图1中的两个线性链表分别表示一元多项式和一元多项式。

从图中可见,每个结点表示多项式中的一项。

图1 多项式表的单链存储结构B:本设计使用了以下数据结构:t ypedef struct {float coef; //系数int expn; //指数} ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode;C:设计本程序需用到九个模块,用到以下九个子函数如下:1、void Menu()//建立菜单2、LNode *InitList() // 创建链表3、void ChaLNode(LNode *L,ElemType x)//插入链表4、LNode *AddPolyn(LNode *A,LNode *B)//多项式相加5、void Invert(LNode *L)//逆序输出链表6、void Print(LNode *L)//输出多项式7、main()//主程序模块调用链一元多项式的各种基本操作模块。

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

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

一元多项式计算(数据结构课程设计)一、系统设计1、算法思想根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。

因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。

为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。

主要用到了单链表的插入和删除操作。

(1)一元多项式加法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。

P 的指数小于q的指数的话就应该复制q的节点到多项式中。

P的指数大于q的指数的话,就应该复制p节点到多项式中。

当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。

当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。

(2)一元多项式的减法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。

p的指数小于q的指数的话,就应该复制q的节点到多项式中。

P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。

当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。

2、概要设计(1)主函数流程图:(注:a代表第一个一元二次方程,b代表第二个一元二次方程)(2)一元多项式计算算法用类C语言表示:Typedef struct00{ //项的表示,多项式的项作为LinkList的数据元素Float coef;//细数Int expn;//指数}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名Typedef LinkList polynomial://用带表头的节点的有序链表表示多项式//基本操作的函数原型说明Void CreatePolyn(polynomail&P);//输入n的系数和指数,建立表示一元多项式的有序链表P 销毁一元多项式P Void DestroyPolyn(polynomailP);销毁一元多项式PvoidPrintPoly(polynomail P);//打印输入一元多项式PIntPolynLength(polynnomail P);//返回一元多项式P中的项数void CreatPolyn(polynomail&Pa.polunomail&Pb);//完成多项式相加运算,即:Pa=Pa+Pb,并贤惠一元多项式Pb voidSubtractPolyn(polunomail&Papolunomail&Pb);//完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb//基本操作的算法描述Int cmp(tem a,temp b);//依a的指数值<(或=)(或>b的住数值,分别返回-1、0和+1Void CreatePolyn(polynomail&P,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表PInitList(P);h=GetHead(P);E.coef=0.0; e.expn=-1;S erCurElem(h,e);//设置头结点的数据元素For (i=1;i<=m;++i){ //依次输入m个非零项Scanf(e.coef,e.epn);If(!LocateElem(P,e,q,(*cmp)())){//当前链表中不存在该指数项If(MakeNode(s,e))InsFirst(q,s);//生成节点并插入链表}}}//CreatPolun二、详细设计1、算法实现(1)输入一元多项式函数:void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");}(2)加法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}(3)减法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}2、程序代码/*一元多项式计算*//*程序功能:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;*//*提示:输入完一元多项式之后,输入“0 0”结束本一元多项式的输入*//*注意:系数只精确到百分位,最大系数只能为999.99,指数为整数.如果需要输入更大的系数,可以对程序中5.2%f进行相应的修改*/#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<conio.h>/*建立结构体*/typedef struct pnode{float xishu; /*系数*/int zhishu; /*指数*/struct pnode *next; /*下一个指针*/}pnode;/*用头插法生成一个多项式,系数和指数输入0时退出输入*/pnode * creat()int m;float n;pnode *head,*rear,*s; /*head为头指针,rear和s为临时指针*/ head=(pnode *)malloc(sizeof(pnode));rear=head; /*指向头*/scanf("%f",&n); /*系数*/scanf("%d",&m); /*输入指数*/while(n!=0) /*输入0退出*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=n;s->zhishu=m;s->next=NULL;rear->next=s; /*头插法*/rear=s;scanf("%f",&n); /*输入系数*/scanf("%d",&m); /*输入指数*/}head=head->next; /*第一个头没有用到*/return head;}/*调整多项式*/void tiaozhen(pnode *head){pnode *p,*q,*t;float temp;p=head;while(p!=NULL){q=p;t=q->next;while(t!=NULL){if(t->zhishu>q->zhishu)q=t;t=t->next;}temp=p->xishu;p->xishu=q->xishu;q->xishu=temp;temp=p->zhishu;p->zhishu=q->zhishu;q->zhishu=temp;p=p->next;}/*显示一个多项式*/void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}/*两个多项式的减法运算*/pnode * sub(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r;float x; /*x为系数相减*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*两个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu-q->xishu; /*系数相减*/if(x!=0) /*相减的差不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}else{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}while(p!=NULL) /*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}while(q!=NULL) /*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/ s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}void add_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=add(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相加如下:");shuchu(c);}void sub_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=sub(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相减如下:");shuchu(c);}void open(){printf("\n****************************************************\n");printf(" 功能项: * 1 两个一元多项式相加;2 两个一元多项式相减;0 退出*\n");printf("****************************************************\n\n请选择操作: ");}void main(){int choose;open();while(choose!=0){scanf("%d",&choose);getchar();switch(choose){case 0:return;case 1:printf("\n 两个一元多项式相加\n");add_main();choose=-1;open();break;case 2:printf("\n 两个一元多项式相减\n");sub_main();choose=-1;open();break;default:printf("没有该选项!请重新选择操作!\n\n");open();}}}三、测试方案及结果1、测试方案在Visual C++ 6.0环境中调试运行。

数据结构课程设计--一元多项式计算问题(C语言)

数据结构课程设计--一元多项式计算问题(C语言)

长沙学院课程设计说明书题目一元多项式计算问题系(部)计算机科学与技术系专业(班级)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项的系数和指数,序列按指数的降序序列排列;其三,多项式排序,多项式按指数的降序序列排列;其四,多项式相加,指数相同系数相加,指数不同则把此项加进去;其五,多项式相减,指数相同系数相加,指数不同则把此项取反再加进去;其六,返回多项式的项数。

数据结构一元多项式的运算

数据结构一元多项式的运算

数据结构一元多项式的运算第一章引言在计算机科学中,数据结构是指一组数据和数据之间的关系,以及在这组数据上定义的一组操作。

数据结构是计算机算法的基础,它能够提高数据的组织和处理效率。

本文将详细介绍一元多项式的运算,包括多项式的表示方式以及常见的运算操作。

第二章多项式的表示方式多项式可表示为一系列项的和,其中每一项由系数和指数组成。

常见的表示方式有两种:________1.数组表示法:________将多项式的每一项按照指数从小到大的顺序存储在一个数组中。

数组的下标表示项的指数,数组的元素存储项的系数。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 可表示为数组 1, -4, 3, 2。

2.链表表示法:________将多项式的每一项作为链表的一个节点,节点包含指数和系数两个属性,通过链表的方式连接起来。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 可表示为链表的形式:________2 ->3 -> -4 -> 1---● ---● ---● ----x^3 x^2 x 1第三章多项式的基本运算多项式的基本运算包括多项式的加法、减法、乘法和求导。

1.多项式的加法:________将两个多项式相加,实际上是将对应指数的系数相加。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1和多项式 Q(x) = x^2 + 2x + 3 相加得到多项式 R(x) = 2x^3 +4x^2 ●2x + 4。

2.多项式的减法:________将一个多项式减去另一个多项式,实际上是将对应指数的系数相减。

例如,将多项式 P(x) 减去多项式 Q(x) 得到多项式 R(x) = 2x^3 + 2x^2 ●6x ●2。

3.多项式的乘法:________将两个多项式相乘,实际上是将一个多项式的每一项与另一个多项式的每一项相乘,然后将结果相加。

例如,将多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 与多项式 Q(x) =x^2 + 2x + 3 相乘得到多项式 R(x) = 2x^5 + 7x^4 ●4x^3 +9x^2 ●5x + 3。

数据结构课程设计《一元多项式的四则运算》

数据结构课程设计《一元多项式的四则运算》

一元多项式的四则运算学生姓名:XX 指导老师:XX摘要本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。

在本课程设计中,程序设计语言为C++语言,程序运行平台为Windows/98/2000/XP,程序采用了链表存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的加、减、乘运算,勉强实现了设计目标,并且经过适当完善后,将可应用到实际中解决某些问题。

关键词程序设计;C++ ;一元多项式;运算1 引言一般来说,我们只知道数学上的一元多项式的运算,这一般都是用笔来进行运算的,然而此课程设计将一元多项式的运算用电脑来进行,只需要将多项式输入,然后就可以出结果,速度快,省去了认为计算的环节,在现实中带来不少方便。

1.1 课题背景一元多项式的运算,虽然无法直接在除数学外的其他领域作出贡献,但是在数学上,它可以为人们解决一些自己动笔动手很难解决的问题,比如说那些很长很长的多项式,用笔算可能要算半天,但是用该程序,只需短短的几秒钟,所以它给人们带来了不少方便,同时相信它也能间接地为其他领域做出贡献。

1.2 课程设计目的个人觉得,该数据结构课程设计一方面可以让自己更加熟悉那些些常用的数据结构,掌握数据结构内在的逻辑关系,以及它们在计算机中的存储表示,和对它们实行的各种运算;另一方面,可以让自己对于整体和局部,以及结构化和模块化编程有一个更深层次的了解。

作为网络工程的学生,虽然之前有过一次C语言课程设计,但是深知自己编程能力尚为欠缺,所以这一次数据结构课程设计是对我的编程能力和组织能力的又一次考验。

1.3课程设计内容本课程设计是用链表实现一元多项式的存储及运算,其中包括多项式系数及指数的录入(即一元多项式的录入),以及储存、一元多项式的显示、一元多项式之间的加、减、乘法运算。

2 设计思路与方案2.1设计思路该系统使用C++语言进行开发和实现,程序中的各个功能分别由不同的的函数实现,然后在main 函数中调用实现。

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

数据结构课程设计(一元多项式)
cout<<" ~~~~~~~~~~~~~~~~0.退出~~~~~~~~~~~~~~~\n";
cout<<" ********1.两个一元多项式相加*********\n";
cout<<" ********2.两个一元多项式相乘*********\n";
cout<<" ********3.两个一元多项式相减*********\n";
cout<<p->coef;//其余情况都得打印
if(p->expn!=0) printf("x^%d",p->expn);//如果指数为"0"不打印指数项
else if((p->coef==1)||(p->coef==-1))
cout<<"1";
if(p->next==NULL)
flag=1;//如果现在的链节没有下一个就结束
(6)NODE *multi(NODE *pa,NODE *pb),函数功能是实现多项式的相乘。创建新链表,生成新结点,第一个式子中的每一项都与第二个式子中每一项系数相乘指数相加,直到两个式子中的结点都运算完毕,返回新链表;
(7)void output(NODE *f),函数功能是输出多项式。把运算完毕的新的多项式按结点依次输出,其中,若结点系数为正数则用+连接前后两个结点,若为负数则用-连接,系数为0则不输出指数;
{
if(q->next==NULL)
{
q->next=pb;
flag=1;
}
else
{
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:一元多项式的计算班级 _____软件1102______ 姓名 _______朱正品_______ 学号 _____112001230______一元多项式的加减一.实验课题:运用数据结构的知识编写一个程序,要求此程序能够进行2个一元多项式的加减,并将答案输出在屏幕上。

二.问题分析:一元多项式可以看做是n个元素的相加,而这n个元素的唯一差别就在于系数和指数,运用数据结构的知识可以通过将2个一元多项式的系数和指数分别存储在2个线性表中,然后通过线性表的检索比较指数,若指数相同就将系数相加,将结果存储在另一个线性表中。

三.程序运行环境:Microsoft Visual Studio四:概要设计存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。

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); }2.1 加,减操作模块——实现加减操作各模块之间的调用关系如下:主程序模块加法操作模块 减法操作模块基本算法: 1、输入输出(1)功能:将要进行运算的多项式输入输出。

(2)数据流入:要输入的多项式的系数与指数。

(3)数据流出:合并同类项后的多项式。

(4)程序流程图:多项式输入流程图如图1所示。

(5)测试要点:输入的多项式是否正确,若输入错误则重新输入用户菜单 多项式链表 各函数退出指针数组 主函数开始 申请结点空间 输入多项式的项数输入多项式各项的系数 x, 指数 y输出已输入的多项式合并同类项否是是否输入正确图表 12、多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图表 2开始定义存储结果的空链 r 是否输出存储多项式的和的链r是否同指数项系数相加后存入r 直接把p 中各项存入r直接把q 中各项存入r 存储多项式2的空链Q 是否为空 存储多项式1的空链P 是否为空合并同类项3、多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图3所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

开始定义存储结果的空链 r是否输出存储多项式的和的链r是 否同指数项系数相加后存入r把p 中各项系数改变符号后存入直接把q 中各项存入r存储多项式2的空链Q 是否为空 存储多项式1的空链P 是否为空 合并同类项图表 3五. 调试分析采用单连表形式按照指数降序排列建立并输出多项式;在相加,相减的过程中如果指数相同就执行系数相加,相减,否则就把大的项直接写入。

完成两个多项式的相加、相减;将从新得到的单连表结果输出;该算法的时间复杂度为两个多项式的项式之和六:调试结果1.测试的数据及结果相乘:相加:相减:程序代码:#include<stdio.h>#include<stdlib.h>typedef struct node{int xs;int zs;struct node * next;}Dnode,* Dnodelist; /*定义结构体*/Dnodelist Creat_node(void) /*链表初始化*/ {Dnodelist D;D=(Dnodelist)malloc(sizeof(Dnode));if(D)D->next=NULL;return D;}int Insert_node(Dnodelist D,int xs,int zs) /*插入函数*/ {Dnodelist p;Dnodelist q;Dnodelist r;p=D;while(p->next){r=p;p=p->next;if(zs==p->zs) /*指数相等,系数直接相加,结束*/ {p->xs=p->xs+xs;return 1;}else if(zs>p->zs) /*指数大于当前数据的,将数据插入当前数据之前,结束*/{q=Creat_node();q->xs=xs;q->zs=zs;r->next=q;q->next=p;return 1;}}/*while(p->next)*/q=Creat_node(); /*要插入的数据指数最小,直接插入至链表最后*/ q->xs=xs;q->zs=zs;q->next=p->next;p->next=q;return 1;free(p);free(q);free(r);}Dnodelist Creat_Dmeth(int length) /*创建多项式*/{int i,m,n;Dnodelist D;D=Creat_node();for(i=0;i<length;i++) /*以三组数据为例*/{scanf("%d,%d",&m,&n);Insert_node(D,m,n); /*调用插入函数,将输入的系数指数插入链表*/ }return D;}Dnodelist Mulresult(Dnodelist D1,Dnodelist D2) /*多项式相乘*/{Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){while(p){x=p->xs*q->xs; /*系数相乘,指数相加*/z=p->zs+q->zs;Insert_node(D,x,z);p=p->next;}p=D1->next;q=q->next;}return D;}Dnodelist Addresult(Dnodelist D1,Dnodelist D2) /*多项式相加*/{Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){x=q->xs;z=q->zs;Insert_node(D,x,z);q=q->next;}while(p){x=p->xs;z=p->zs;Insert_node(D,x,z);p=p->next; /*直接插入数据,利用插入函数可完成该功能*/}return D;}Dnodelist Subresult(Dnodelist D1,Dnodelist D2) /*多项式相减*/{Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(p&&q){if((p->zs)<(q->zs)) /*指数小(1的数据在2中不存在),直接插入*/{x=-(q->xs); /*由于是式1减式2,所以系数置负*/z=q->zs;Insert_node(D,x,z);q=q->next;}else if((p->zs)>(q->zs)) /*指数大(2的数据在1中不存在),直接插入*/{x=p->xs;z=p->zs;Insert_node(D,x,z);p=p->next;}else /*指数相同的先将系数相减,再插入*/{z=q->zs;x=(p->xs)-(q->xs);Insert_node(D,x,z);p=p->next;q=q->next;}}/*while(p&&q)*/while(p){x=p->xs;z=p->zs;Insert_node(D,x,z);p=p->next;}while(q){x=-(q->zs);z=q->zs;Insert_node(D,x,z);q=q->next;} /*将未遍历完的数据直接插入*/return D;}Dnodelist select(Dnodelist D1,Dnodelist D2) /*选择函数*/{Dnodelist D;int s;printf("请选择:\n1:相乘\n2:相加\n3:相减\n");scanf("%d",&s);switch(s){case 1: D=Mulresult(D1,D2); /*调用相乘函数*/printf("相乘结果(系数,指数):\n");break;case 2: D=Addresult(D1,D2); /*调用相加函数*/printf("相加结果(系数,指数):\n");break;case 3: D=Subresult(D1,D2); /*调用相减函数*/printf("相减结果(系数,指数):\n");break;default:printf("无此选项\n");break;}return D;}void Show(Dnodelist D) /*显示(输出)函数*/{Dnodelist r;r=D->next;while(r){printf("(%d,%d)+",r->xs,r->zs);r=r->next;}printf("\n");}void main(){Dnodelist D1,D2,D;int length;D1=Creat_node();D2=Creat_node(); /*D1为多项式1,D2为多项式2,初始化*/ printf("输入多项式1的组数:\n");scanf("%d",&length);printf("输入多项式1系数,指数:(%d组)\n",length);D1=Creat_Dmeth(length); /*创建多项式1*/printf("输入多项式2的组数:\n");scanf("%d",&length);printf("输入多项式2系数,指数:(%d组)\n",length);D2=Creat_Dmeth(length); /*创建多项式2*/D=select(D1,D2); /*选择运算方式*/Show(D); /*输出显示*/ getchar();}。

相关文档
最新文档