ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:207.53KB ,
资源ID:7700601      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7700601.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构协同作业试验项目文档第二组.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构协同作业试验项目文档第二组.docx

1、数据结构协同作业试验项目文档第二组上海交通大学网络教育数据结构协同作业实验线性表1 顺序表操作验证 21.1 实验目的 21.2 实验内容 22 一元多项式相加实验 23 开发环境 24 算法设计介绍 34.1 设计思路 34.2 详细设计 65 界面流程展示 76 检查及测试报告 96.1 检查报告 96.2 测试报告 97 附程序源代码 107.1 一元多项式验证: 107.2 顺序表操作验证: 17 1 顺序表操作验证1.1 实验目的 (1) 掌握线性表的顺序存储结构; (2) 验证顺序表及其基本操作的实现; (3) 掌握数据结构及算法的程序实现的基本方法。 1.2 实验内容 (1) 建

2、立含有若干个元素的顺序表; (2) 对已建立的顺序表实现插入、删除、查找等基本操作。2 一元多项式相加实验已知 A( x )= a0 + a1x + a2x2 + + anxn 和B(x) = b0 + b1x + b2x2 + + amxm ,并在 A( x ) 和 B( x ) 中指数相差很多,求 A( x ) = A( x ) + B(x) 。3 开发环境软件平台:Windows XP软件环境:Microsoft Visual C+ 6.0 最低硬件配置:内存64MB或以上、硬盘3.2G或以上4 算法设计介绍4.1 设计思路分析:1存储结构分析根据一元多项式的特点,要表示一个多项式,只要

3、存储第i项以及ai的值,并且如果ai为0的话,该项就不用存储了,从而减少一个存储空间。在线性表中可以通过顺序和链式存储,并用Ti表示一个数据项Ti=(ai,i)。下面以图示表示两种存储结构(假设a2=0)。 图1 顺序存储表 图2 单链表存储 以上两个图可知,在存储空间分配量上两种结构是一致的,但如果两多项式相加的话需要频繁的做插入操作,顺序表的结构特性决定了插入操作的时间复杂度为O(n/2),链式表的时间复杂度为O(1),并且如果存储的是一个排好序的多项式的话,不需要双向查找,因此选择单链表存储。 2相加算法分析首先,由于两个多项式A(x)和B(x)的指数相差非常多,因此一定要把输入的多项式

4、按照指数i排好序,防止过高的查找时间复杂度;其次,两个AB多项式同时从head开始查找,AB指数i相同的计算相加ai值存入A表,并且回收不需要的B空间,指数不同的,B指数小的节点插到A指数大的前面。以此往后推移。其时间复杂度为O(n)。举例:A(x)=2+3x+1x3B(x)=1+3x+2x2+2x4+12x7+32x8+42x11+2x12整个相加过程如下: 见注释1图3 初始化后的A(x) pA=headA图4 初始化后的B(x) pB=HeadB-next第一步:图5 A(x) pA-next系数pB系数图6 B(x) pA-next指数0与pB指数0相等 free pB所指节点第二步与

5、第一步做法一致第三步 将pB的节点插入pA后第四步pA-next指数小于pB指数,pA=pA-next, pB不动第五步pA没有后继节点,直接把pB的所有节点接到pA后即可4.2 详细设计a) 数据结构 typedef struct term float coef; /系数 int expn; /指数 struct term *next /指向下一节点 term b) 输入输出输入:两个多项式A,B输出:A+B样式:输入一元多项式的项数2请依次输入非零2个非零项,请注意输入格式2 23 33X3+2X214 (+ - * 退出)4个选项再输入一元多项式的项数3请依次输入非零3个非零项,请注意输

6、入格式2 23 34 43X3+2X2 + 4X4+3X3+2X2 = 4X4+6X3+4X2c) 函数原型主函数:void main()输入函数: InputPolynomial(LinkList &p)多项式相加函数: term* APolyn(term *Pa, term *Pb)多项式相减函数: term* BPolyn(term *Pa, term *Pb)多项式相乘函数: term* CPolyn(term *Pa, term *Pb)输出函数: void PrintfPoly(term *P)5 界面流程展示第一步:先输入第一个“一元多项式的项数”第二步,根据一元多项式的项数,输

7、入非零项。注意输入格式,系数和指数之间要有空格。第三步,选择要进行的运算方式编码第四步,再输入第二个“一元多项式的项数”,方式如第二步一致,最后回车进行运算6 检查及测试报告6.1 检查报告检查名称检查任务完成情况是否安装程序运行环境已经正确设定程序代码检查程序单位首部有程序说明和修改备注变量、过程、函数命令符合规则程序中有足够的说明信息修改注释符合要求类库的使用符合要求画面及报表格式检查画面及报表格式符合规定需求程序命名符合格式需求画面和报表的字段位置和宽度与设计文档一致6.2 测试报告测试名称测试任务完成情况是否功能键、触发键、按钮、菜单、选择项功能正确数据项关联及限制功能正确设计文档规定

8、的其他功能正确性测试读/写/删除操作结果正确各种组合条件之查询或报价正确设计文档规定的其他操作可靠性测试非法键容错测试异常字符容错测试程序副作用检查残留文件检查效率测试输入画面效率测试报表及查询效率测试其他测试7 附程序源代码7.1 一元多项式验证:#include #include #include typedef struct term /项的表示,多项式的项作为LinkList的数据元素 float coef; /系数 int expn; /指数 struct term *next; term; term* CreatPolyn(term *P,int m) / 输入m项的系数和指数,建

9、立表示一元多项式的有序链表P if(m coef = 0.0; int i; printf(依次输入%d个非零项,请注意输入格式,系数和指数之间要有空格,ex:2 2 3 1n,m); for (i = 1; i coef,&P-expn); if(P-coef) q = P; P = P-next = (term*)malloc(sizeof(term); q-next = NULL; free(P); return h; / CreatPolyn term* selsort(term *h) term *g, *p, *q; if(!h) return NULL; float f; int

10、 i, fini = 1; for(g = h;g-next&fini;g = g-next) fini = 0; for(p = h,q = h-next;q;p = p-next,q = q-next) if (p-expn expn) f = p-coef;i = p-expn; p-coef = q-coef;p-expn = q-expn; q-coef = f;q-expn = i; fini = 1; for(g = h,p = g-next;p;) if(g-expn=p-expn) g-coef += p-coef; g-next = p-next; q = p; p = p

11、-next; free(q); else if(g-next) g = g-next; p = p-next; return h;void PrintfPoly(term *P) term *q = P; if(!q) putchar(0); return; if(q-coef!=1) printf(%g,q-coef); if(q-expn=1) putchar(X); else if(q-expn) printf(X%d,q-expn); else if(!q-expn) putchar(1); else if(q-expn=1) putchar(X); else printf(X%d,q

12、-expn); q = q-next; while (q) if(q-coef 0) putchar(+); if(q-coef!=1) printf(%g,q-coef); if(q-expn=1) putchar(X); else if(q-expn) printf(X%d,q-expn); else if(!q-expn) putchar(1); else if(q-expn=1) putchar(X); else printf(X%d,q-expn); q = q-next; Compare(term *a, term *b) if (a-expn expn) return -1; i

13、f (a-expn b-expn) return 1; return 0; term* APolyn(term *Pa, term *Pb)/ 多项式加法:Pa = PaPb,利用两个多项式的结点构成和多项式。 term *h, *qa = Pa, *qb = Pb, *p, *q; float sum; h = p = (term*)malloc(sizeof(term); p-next = NULL; while (qa & qb) / Pa和Pb均非空 switch (Compare(qa,qb) case -1: / 多项式PA中当前结点的指数值小 p-next = qb; p = q

14、b; qb = qb-next; break; case 0: / 两者的指数值相等 sum = qa-coef + qb-coef; if (sum != 0.0) / 修改多项式PA中当前结点的系数值 p-next = qa; qa-coef = sum; p = qa; qa = qa-next; else / 删除多项式PA中当前结点 q = qa; qa = qa-next; free(q); q = qb; qb = qb-next; free(q); break; case 1: / 多项式PB中当前结点的指数值小 p-next = qa; p = qa; qa = qa-nex

15、t; break; / switch / while if (Pa) p-next = qa; / 链接Pa中剩余结点 if (Pb) p-next = qb; / 链接Pb中剩余结点 q = h; h = h-next; free(q); return h; / APolyn term* A(term *Pa, term *Pb) int n; puts(再输入一元多项式的项数); scanf(%d,&n); Pb = CreatPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa); if(Pb & Pb-coef0) printf( + ); Prin

16、tfPoly(Pb); Pa = APolyn(Pa,Pb); printf( = ); Pa = selsort(Pa); PrintfPoly(Pa); return Pa;term* BPolyn(term *Pa, term *Pb) /多项式减法:Pa = Pa-Pb,利用两个多项式的结点构成差多项式。 term *p = Pb; while(p) p-coef *= -1; p = p-next; return APolyn(Pa,Pb); / BPolyn term* B(term *Pa, term *Pb) int n; puts(再输入一元多项式的项数); scanf(%d

17、,&n); Pb = CreatPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa); printf( - ); putchar();PrintfPoly(Pb);putchar(); Pa = BPolyn(Pa,Pb); printf( = ); Pa = selsort(Pa); PrintfPoly(Pa); return Pa; term* CPolyn(term *Pa, term *Pb) /多项式乘法:Pa = Pa*Pb,利用两个多项式的结点构成积多项式。 if(!Pb) return NULL; term *pa = Pa, *p, *

18、q, *r, *s, *t; r = p = (term*)malloc(sizeof(term); while(pa) p-coef = pa-coef; p-expn = pa-expn; q = p; p = p-next = (term*)malloc(sizeof(term); pa = pa-next; q-next = NULL; free(p); pa = Pa; t = s = (term*)malloc(sizeof(term); while(pa) q = s; s = s-next = (term*)malloc(sizeof(term); pa = pa-next;

19、q-next = NULL; free(s); pa = Pa; while(pa) pa-coef *= Pb-coef; pa-expn += Pb-expn; pa = pa-next; Pb = Pb-next; while(Pb) p = r; s = t; while(p) s-coef = p-coef * Pb-coef; s-expn = p-expn + Pb-expn; p = p-next; s = s-next; Pa = APolyn(Pa,t); Pb = Pb-next; return Pa; / CPolyn term* C(term *Pa, term *P

20、b) int n; puts(再输入一元多项式的项数); scanf(%d,&n); Pb = CreatPolyn(Pb,n); Pb = selsort(Pb); putchar();PrintfPoly(Pa);putchar(); printf( * ); putchar();PrintfPoly(Pb);putchar(); printf( = ); Pa = CPolyn(Pa,Pb); Pa = selsort(Pa); PrintfPoly(Pa); return Pa; void main() term *M,*N; char s2; int i,n; puts(一元多项式计

21、算:n输入一元多项式的项数); scanf(%d,&n); M = CreatPolyn(M,n); M = selsort(M); PrintfPoly(M); p: puts(n1:加n2:减n3:乘n4:退出); getchar(); q: gets(s); if(s1!=0 | !isdigit(*s) puts(输入有误,请重新输入!);goto q; i = *s-48; switch(i) case 1:M = A(M,N);goto p; case 2:M = B(M,N);goto p; case 3:M = C(M,N);goto p; case 4:break; defa

22、ult:puts(输入有误,请重新输入!);goto q; 7.2 顺序表操作验证:#include #include #include typedef struct term /项的表示,多项式的项作为LinkList的数据元素 int expn; /指数 struct term *next; term, *LinkList; term* CreatPolyn(term *P,int m) / 输入m项的系数和指数,建立表示一元多项式的有序链表P if(m = 0) return NULL; term *h = P = (term*)malloc(sizeof(term), *q; int

23、i; printf(输入整数要有空格,ex:2 2 3 1n,m); for (i = 1; i expn); q=P; P = P-next = (term*)malloc(sizeof(term); q-next = NULL; free(P); return h; / CreatPolyn void FindData(term *p, int data) term *q=p; while(q) if(q-expn=data) break; else q=q-next; if(q) printf(查找到数据n); term* DeleteData(LinkList *p, int data

24、) LinkList *q; term *h; term *r; q=p; h=r=*p; if(!q) printf(连表为空); return h; while(*q) if(*q)-expn=data) term *t=(*q); r-next=t-next; free(t); break; else r=*q; (*q)=(*q)-next; return h;void PrintList(term *h) printf(连表数据:n); while(h) printf(%d , h-expn); h=h-next; term *InsertData(LinkList *p, int

25、fData, int iData) LinkList *q; term *r,*h; term* data; q=p; r=*q; h=*q; if(!q) printf(连表为空); return h; while(*q) if(*q)-expn=fData) data= (term *)malloc(sizeof(term); data-expn=iData; data-next=(*q); r-next=data; break; else r=*q; (*q)=(*q)-next; return h;void main() term *M,*N; char s2; int i,n,data1,data2; puts(请输入数据个数); scanf(%d,&n); M = CreatPolyn(M,n); PrintList(M); p: puts(n1:查找n2:删除n3:插入n4:退出); getchar(); q: gets(s); if(s1!=0 | !isdigit(*s) puts(输入有误,请重新输入!);goto

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1