版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实习1、一元稀疏多项式计算器一、 需求分析1. 问题描述设计一个一元稀疏多项式简单计算器。2. 基本要求 一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式。(2)输出多项式,输出形式为整数序列:n, c1, e1, c2, e2, ········,cn, en ,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排列。(3)多项式a和b想加,建立多项式a+b 。(4)多项式a和b想减,建立多项式a-b 。3. 测试数据 (1) (2x+5x8-3.1x11)+(7-5x8+11x
2、9)=(-3.1x11+11x9+2x+7) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+12x-3-x) (3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (4) (x+x3)+(-x-x3)=0 (5) (x+x100)+(x100+x200)=(x+2x100+x200) (6) (x+x2+x3)+0=(x+x2+x3) (7) 互换测试数据的前后两个多项式。4. 实现提示 用带表头结点的单链表存储多项式。二、概要设计为实现上述程序功能,应用带头结点的单链表存储多项式
3、。为此需要一个抽象数据类型:一元多项式。1.抽象数据类型一元多项式定义为:ATD Ploynomial 数据对象:D=ai|aiTermset, i=1,2,3···,m,m0 Termset中的每个元素包含一个表示系数的实数和表示指数的整数数据关系:R1=<ai-1,ai>ai-1,aiD,且ai-1中的指数<ai中的指数的值,i=1,2,3···n基本操作:Insert(p,h)初始条件:h已存在。操作结果:插入p项。CreateLinklist(head, m)操作结果:建立一个头指针为head、项数为m的一元
4、多项式。DestroyLinklist( p)初始条件:一元多项式p已存在。操作结果:销毁一元多项式p。PrintLinklist( P)初始条件:一元多项式p已存在。操作结果:输出一元多项式p。Compare(a,b) 初始条件:项a,b已存在。操作结果:比较a,b中x的指数的大小。 AddLinklist(pa,pb)初始条件:一元多项式pa,pb已存在。操作结果:完成一元多项式pa,pb的相加运算。SubtractionLinklist(Sa,Sb) 初始条件:一元多项式Sa,Sb已存在。操作结果:完成一元多项式Sa,Sb的相减运算。 ATD Ploynomial三、详细设计(源代码)(
5、使用C语言)#include<stdio.h>#include<malloc.h>#define maxlen 10#define large 999typedef struct Linklistomial float coef; int expn; struct Linklistomial *next;Linklistomial,*Linklist;/结点类型,指针类型void Insert(Linklist p,Linklist h)/ h已存在插入p项 if(p->coef=0) free(p);/系数为0的话释放结点 else Linklist q1,q2
6、; 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; Linklis
7、t CreateLinklist(Linklist head,int m)/建立一个头指针为head、项数为m的一元多项式 int i; Linklist p; p=head=(Linklist)malloc(sizeof(struct Linklistomial); head->next=NULL; for(i=0;i<m;i+) p=(Linklist)malloc(sizeof(struct Linklistomial);/建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1); scanf("%f %d",&a
8、mp;p->coef,&p->expn); Insert(p,head); /调用Insert函数插入结点 return head;void DestroyLinklist(Linklist p)/销毁多项式p Linklist D1,D2; D1=p; while(D1) D2=D1->next; free(D1); D1=D2; void PrintLinklist(Linklist P)/输出一元多项式p Linklist q=P->next; int flag=1; /项数计数器 if(!q) /若多项式为空,输出0 putchar('0'
9、;); printf("n"); return; while(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)
10、; else if(q->coef=1) if(!q->expn) putchar('1'); else if(q->expn=1) putchar('X'); else printf("X%d",q->expn); if(q->coef=-1) if(!q->expn) printf("-1"); else if(q->expn=1) printf("-X"); else printf("-X%d",q->expn); q=q->
11、;next; flag+; printf("n");int Compare(Linklist a,Linklist b)/比较a,b中x的指数的大小 if(a&&b) if(!b|a->expn>b->expn) return 1; else if(!a|a->expn<b->expn) return -1; else return 0; else if(!a&&b)/a多项式已空,但b多项式非空 return -1; else/b多项式已空,但a多项式非空 return 1;Linklist AddLin
12、klist(Linklist pa,Linklist pb)/求解并建立多项式a+b,返回其头指针 Linklist qa=pa->next; Linklist qb=pb->next; Linklist headc,hc,qc; hc=(Linklist)malloc(sizeof(struct Linklistomial);/建立头结点 hc->next=NULL; headc=hc; while(qa|qb) qc=(Linklist)malloc(sizeof(struct Linklistomial); switch(Compare(qa,qb) case 1: q
13、c->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->
14、;next; hc->next=qc; hc=qc; else free(qc);/当相加系数为0时,释放该结点 return headc;Linklist SubtractionLinklist(Linklist Sa,Linklist Sb)/求解并建立多项式a-b,返回其头指针 Linklist Cb=Sb->next; while(Cb) Cb->coef=(-1)*Cb->coef; Cb=Cb->next; return AddLinklist(Sa,Sb);int main() int m,n,a=1; char flag; Linklist pa=
15、0,pb=0,pc; printf(" 欢迎使用一元多项式加法器nn");/输出菜单 printf(" *n"); printf(" * 一元多项式简单运算器 *n"); printf(" * *n"); printf(" * A: 输入多项式a B: 输入多项式b *n"); printf(" * *n"); printf(" * C: 输出多项式a D: 输出多项式b *n"); printf(" * *n"); printf(&q
16、uot; * E: 输出a+b F: 输出a-b *n"); printf(" * *n"); printf(" * G: 使用完毕! *n"); printf(" *n"); while(a) printf("n 请选择操作:"); scanf(" %c",&flag);/空格符号一定要注意 switch(flag) case'A': case'a': printf("下面进行多项式a的输入:n"); printf(&quo
17、t;请输入a的项数:"); scanf("%d",&m); pa=CreateLinklist(pa,m);/建立多项式a break; case'B': case'b': printf("下面进行多项式b的输入:n"); printf("请输入b的项数:"); scanf("%d",&n); pb=CreateLinklist(pb,n);/建立多项式b break; case'C': case'c': printf("n 多项式a="); PrintLinklist(pa); break; case'D': case'd': printf("n 多项式b="); PrintLinklist(pb); break; case'E': case'e': pc=AddLinklist(pa,pb); printf("n a+b="); PrintLinklist(pc); break; case'F': case'f':
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年心理学基础知识与心理健康维护题集
- 2026年心理学专业考试复习宝典基础知识核心习题
- 2026年网络安全管理与防护技能测试题库
- 凤冈县法院系统招聘考试真题2025
- 浙江省宁波市2025-2026学年高一上学期期末考试数学试卷含答案
- 2026年旅游酒店服务与管理专业知识题
- 2026年网络安全攻防演练题Web安全与渗透测试
- 2025年重庆新华书店笔试题目及答案
- 2025年电网事业单位考试题及答案
- 2025年潮南事业单位考试真题及答案
- 2025年江苏省南京师大附中高考地理模拟试卷(5月份)
- 红色故都瑞金教学课件
- 2026届高考地理一轮基础复习训练2地图、等高线地形图和地形剖面图
- 生物基戊二酸绿色合成工艺与催化剂优化设计
- 名企参考:万达集团组织结构及部门职责
- 电力林地占用赔补协议书
- 酒店高级技师试题及答案
- 2024年全国职业院校技能大赛高职组(社区服务实务赛项)考试题库(含答案)
- 2025廉洁过春节紧绷纪律弦春节廉洁提醒课件
- 招商证券科创板评测10题及答案2021
- DL∕T 2591-2023 垃圾发电厂垃圾储运系统运行规程
评论
0/150
提交评论