数据结构课程设计一元多项式计算器.docx
- 文档编号:6563288
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:14
- 大小:173.88KB
数据结构课程设计一元多项式计算器.docx
《数据结构课程设计一元多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式计算器.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计一元多项式计算器
实习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+11x9)=(-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.实现提示
用带表头结点的单链表存储多项式。
二、概要设计
为实现上述程序功能,应用带头结点的单链表存储多项式。
为此需要一个抽象数据类型:
一元多项式。
1.抽象数据类型一元多项式定义为:
ATDPloynomial{
数据对象:
D={ai|ai∈Termset,i=1,2,3···,m,m≥0Termset中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:
R1={ 基本操作: Insert(p,h) 初始条件: h已存在。 操作结果: 插入p项。 CreateLinklist(head,m) 操作结果: 建立一个头指针为head、项数为m的一元多项式。 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的相减运算。 }ATDPloynomial 三、详细设计(源代码) (使用C语言) #include #include #definemaxlen10 #definelarge999 typedefstructLinklistomial { floatcoef; intexpn; structLinklistomial*next; }Linklistomial,*Linklist;//结点类型,指针类型 voidInsert(Linklistp,Linklisth) {//h已存在插入p项 if(p->coef==0) free(p);//系数为0的话释放结点 else { Linklistq1,q2; q1=h; q2=h->next; while(q2&&p->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;} } } LinklistCreateLinklist(Linklisthead,intm) {//建立一个头指针为head、项数为m的一元多项式 inti; Linklistp; p=head=(Linklist)malloc(sizeof(structLinklistomial)); head->next=NULL; for(i=0;i { p=(Linklist)malloc(sizeof(structLinklistomial));//建立新结点以接收数据 printf("请输入第%d项的系数与指数: ",i+1); scanf("%f%d",&p->coef,&p->expn); Insert(p,head);//调用Insert函数插入结点 } returnhead; } voidDestroyLinklist(Linklistp) {//销毁多项式p LinklistD1,D2; D1=p; while(D1) { D2=D1->next; free(D1); D1=D2; } } voidPrintLinklist(LinklistP) {//输出一元多项式p Linklistq=P->next; intflag=1;//项数计数器 if(! q) {//若多项式为空,输出0 putchar('0'); 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'); elseif(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"); } intCompare(Linklista,Linklistb) {//比较a,b中x的指数的大小 if(a&&b) { if(! b||a->expn>b->expn) return1; elseif(! a||a->expn return-1; else return0; } elseif(! a&&b)//a多项式已空,但b多项式非空 return-1; else//b多项式已空,但a多项式非空 return1; } LinklistAddLinklist(Linklistpa,Linklistpb) {//求解并建立多项式a+b,返回其头指针 Linklistqa=pa->next; Linklistqb=pb->next; Linklistheadc,hc,qc; hc=(Linklist)malloc(sizeof(structLinklistomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb) { qc=(Linklist)malloc(sizeof(structLinklistomial)); switch(Compare(qa,qb)) { case1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case0: { 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时,释放该结点 } returnheadc; } LinklistSubtractionLinklist(LinklistSa,LinklistSb) {//求解并建立多项式a-b,返回其头指针 LinklistCb=Sb->next; while(Cb) { Cb->coef=(-1)*Cb->coef; Cb=Cb->next; } returnAddLinklist(Sa,Sb); } intmain() { intm,n,a=1; charflag; Linklistpa=0,pb=0,pc; printf("欢迎使用一元多项式加法器\n\n");//输出菜单 printf("*******************************************************\n"); printf("*一元多项式简单运算器*\n"); printf("**\n"); printf("*A: 输入多项式aB: 输入多项式b*\n"); printf("**\n"); printf("*C: 输出多项式aD: 输出多项式b*\n"); printf("**\n"); printf("*E: 输出a+bF: 输出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("请输入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("\na+b="); PrintLinklist(pc); break; } case'F': case'f': { pc=SubtractionLinklist(pa,pb); printf("\na-b="); PrintLinklist(pc); break; } case'G': case'g': { DestroyLinklist(pa); DestroyLinklist(pb); a=0; printf("\n欢迎下次使用! \n"); break; } default: printf("\n您的选择错误,请重新选择! \n"); } } return0; } 四、调试分析 编译环境为CodeBlocks。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 多项式 计算器