链表线性结构(多项式的加减乘除)_第1页
链表线性结构(多项式的加减乘除)_第2页
链表线性结构(多项式的加减乘除)_第3页
链表线性结构(多项式的加减乘除)_第4页
链表线性结构(多项式的加减乘除)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构与算法课程类型:必修实验项目:线性结构及其应用实验题目:多项式的加减乘除和特定值带入实验日期:2017/11/5班级:学号:姓名:安宏宇设计成绩报告成绩指导老师张岩一、实验目的设计线性表的链式存储结构,并实现一元多项式的代数运算。二、实验要求及实验环境(1)实验要求:以链表存储一元多项式,在此基础上完成对多项式的代数操作。 1.能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。 2.能够计算多项式在某一点 x=x0 的值,其中

2、x0 是一个浮点型常量,返回结果为浮点数。 3.能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法运算的结果包括商多项式和余数多项式。 4.要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收操作。(提示:利用循环链表结构和可用空间表的思想,把循环链表表示的多项式返还给可用空间表,从而解决上述问题)。(2)实验环境:windows下的CB;三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1逻辑设计:struct polynode int coef; int exp; struct polynode * link;/建立链

3、表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);/多项式插入poly *newPoly();/新链表poly *padd(poly *p1,poly *p2);/多项式加法poly *pmul(poly *p1,poly *p2);/乘法poly *inputPoly();/输入多项式poly *psub(poly *p1,poly *p2);/减poly *pdiv(poly *p1,poly *p2);/除poly *inputPoly1();double caculate(double x,poly *p);/

4、计算多项式void sortPoly(poly *p);/多项式排序void outputPoly(poly*p);/输出多项式void delPoly(poly*p);/清空多项式 2物理设计:四、测试结果五、经验体会与不足不能连续输入多个多项式函数设计不够简洁算法过于直接简单加注释后修改代码方便六、附录:源代码(带注释)#include <stdio.h>#include <stdlib.h>struct polynode int coef; int exp; struct polynode * link;/建立新链表typedef struct polynode

5、poly;poly* Attch(int c,int e,poly *d);/插入链表poly *newPoly();/建立新链表poly *padd(poly *p1,poly *p2);/加法poly *pmul(poly *p1,poly *p2);/乘法poly *inputPoly();/输入多项式poly *psub(poly *p1,poly *p2);/减法poly *pdiv(poly *p1,poly *p2);/除法poly *inputPoly1();/输入double caculate(double x,poly *p);/计算void sortPoly(poly *

6、p);/排序void outputPoly(poly*p);/输出多项式void delPoly(poly*p);/除法void Insert(poly *p,poly *h) if(p->coef=0) free(p); else poly *q1,*q2; q1=h;q2=h->link; while(q2&&p->exp<q2->exp) q1=q2; q2=q2->link; /*判断两个指数是否相等*/ if(q2&&p->exp=q2->exp) q2->coef+=p->coef; fre

7、e(p); if(!q2->coef) q1->link=q2->link; free(q2); /*相等就加系数*/ else p->link=q2; q1->link=p; /*不等就插在后面*/int main() poly *p1,*p2,*padd1,*psub1,*pmul1; p1=newPoly(); printf("第一个多项式n"); p1->link=inputPoly(); outputPoly(p1); p2=newPoly(); printf("第二个多项式n"); p2->link=

8、inputPoly1(); outputPoly(p2); padd1=newPoly(); pmul1=newPoly(); psub1=newPoly(); padd1->link=padd(p1,p2); printf("paddn"); outputPoly(padd1); psub1->link=psub(p1,p2); printf("psubn"); outputPoly(psub1); pmul1->link=pmul(p1,p2); printf("pmuln"); outputPoly(pmul1

9、); printf("输入x的值!"); int x; scanf("%d",&x); x=caculate(x,p1); printf("%dn",x); pdiv(p1,p2); return 0;poly *newPoly() poly *x; x=(poly*)malloc(sizeof(poly); x->link=NULL; x->coef=0; x->exp=0; return x;poly* Attch(int c,int e,poly *d) poly *x; x=newPoly(); x-

10、>coef=c; x->exp=e; d->link=x; return x;poly *padd(poly *p1,poly *p2) poly *a, *b,*c,*d,*p; c=newPoly(); d=c; p=c; a=p1->link; b=p2->link; while(a!=NULL&&b!=NULL) if(a->exp>b->exp)/如果a的系数大于b把a先输入 c=Attch(a->coef,a->exp,c); a=a->link; else if(a->exp<b->

11、;exp)/小于相反 c=Attch(b->coef,b->exp,c); b=b->link; else/相等 c=Attch(b->coef+a->coef,a->exp,c); a=a->link; b=b->link; /*a b比较完成开始遍历剩下的未插入的*/ while(a!=NULL) c=Attch(a->coef,a->exp,c); a=a->link; while(b!=NULL) c=Attch(b->coef,b->exp,c); b=b->link; c->link=NULL

12、; d=d->link; p->link=NULL; delPoly(p); return d;poly *psub(poly*p1,poly*p2)/加和减思路相同,b的系数得输入相反值 poly *a, *b,*c,*d,*p; c=newPoly(); d=c; p=c; a=p1->link; b=p2->link; while(a!=NULL&&b!=NULL) if(a->exp>b->exp) c=Attch(a->coef,a->exp,c); a=a->link; else if(a->exp&

13、lt;b->exp) c=Attch(b->coef*(-1),b->exp,c); b=b->link; else if(a->coef-b->coef)>0) c=Attch(a->coef-b->coef,a->exp,c); a=a->link; b=b->link; else a=a->link; b=b->link; while(a!=NULL) c=Attch(a->coef,a->exp,c); a=a->link; while(b!=NULL) c=Attch(b->c

14、oef*(-1),b->exp,c); b=b->link; c->link=NULL; d=d->link; p->link=NULL; delPoly(p); return d;/*乘法,先用第一个链表的第一个数据乘以第二个链表里的所有值,储存在新的链表中,之后遍历一中所有的值,最后把这些多项式加在一起。*/poly *pmul(poly*p1,poly*p2)/乘法 poly*a,*b,*c,*d,*q,*sum; int aex,aco; a=p1->link; b=p2->link; sum=newPoly(); q=sum; while(a

15、!=NULL) c=newPoly(); d=c; aco=a->coef; aex=a->exp; while(b!=NULL) c=Attch(aco*(b->coef),aex+(b->exp),c); b=b->link; b=p2->link; sum->link=padd(d,sum); a=a->link; delPoly(d); sum=sum->link; q->link=NULL; delPoly(q); sortPoly(sum); return sum;/*除法:先用链表一第一个的系数除以第二个链表的第一个系数

16、,得到的值乘以被除多项式,再用第一个多项式减。最后得到一个最大系数比被除数小的多项式。*/ poly *pdiv(poly*p1,poly*p2) poly *hf,*pf,*temp1,*temp2; poly *q1; q1=p1->link; poly *q2; q2=p2->link; hf=newPoly(); hf->link=NULL; pf=newPoly(); pf->link=NULL; temp1=newPoly(); temp1->link=NULL; temp2=newPoly(); temp2->link=NULL; temp1=

17、padd(temp1,p1); while(q1->exp>=q2->exp) temp2->link=newPoly(); temp2->link->coef=(q1->coef)/(q2->coef); temp2->link->exp=(q1->exp)-(q2->exp); Insert(temp2->link,hf); p1=psub(p1,pmul(p2,temp2); q1=p1->link; temp2->link=NULL; pf=psub(temp1,pmul(hf,p2); p2=t

18、emp1; printf("商是"); outputPoly(hf); printf("余数是"); outputPoly(pf);/*输入:多项式的系数和指数存在p1文件中,两个两个读,分别赋给多项式的系数和指数。*/poly *inputPoly() poly *q,*p; p=newPoly(); q=p; FILE *fp; if(fp=fopen("c:p1.txt","rt")=NULL) printf("nCannot open file strike any key exit!"

19、); getch(); exit(1); int a,b; while(fscanf(fp,"%d %d",&a,&b)!=-1) p->link=newPoly(); p=p->link; p->coef=a; p->exp=b; p=q; sortPoly(q); q=q->link; p->link=NULL; delPoly(p); fclose(fp); return q;poly *inputPoly1() poly *q,*p; p=newPoly(); q=p; FILE *fp; if(fp=fopen(

20、"c:p2.txt","rt")=NULL) printf("nCannot open file strike any key exit!"); getch(); exit(1); int a,b; while(fscanf(fp,"%d %d",&a,&b)!=-1) p->link=newPoly(); p=p->link; p->coef=a; p->exp=b; p=q; sortPoly(q); q=q->link; p->link=NULL; delPoly(p); fclose(fp); return q;/*输出:读取系数和指数,按a*xb的形式输出*/void outputPoly(poly*p) poly*q; q=p->link; if(q!=NULL) printf("%dx%d ",q->coef,q->exp); q=q->link; else printf("0"); while(q!=NULL) if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论