收藏 分销(赏)

数据结构(C语言)一元稀疏多项式计算器.doc

上传人:xrp****65 文档编号:7591550 上传时间:2025-01-09 格式:DOC 页数:12 大小:146.50KB
下载 相关 举报
数据结构(C语言)一元稀疏多项式计算器.doc_第1页
第1页 / 共12页
数据结构(C语言)一元稀疏多项式计算器.doc_第2页
第2页 / 共12页
数据结构(C语言)一元稀疏多项式计算器.doc_第3页
第3页 / 共12页
数据结构(C语言)一元稀疏多项式计算器.doc_第4页
第4页 / 共12页
数据结构(C语言)一元稀疏多项式计算器.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、实验报告一题目:编制一个一元稀疏多项式计算器班级:1302018 姓名:王雪 学号:13020188030 完成日期:2014.4.5一、需求分析1、一元稀疏多项式简单计算器的功能是:1.1 输入并建立多项式;1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 1.3多项式a和b相加,建立多项式a+b;1.4 多项式a和b相减,建立多项式a-b。2、设计思路:2.1 定义线性表的动态分配顺序存储结构;2.2 建立多项式存储结构,定义指针*next2.3利用链表实现队列的构造。每次输入一项

2、的系数和指数,可以输出构造的一元多项式2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。多项式显示的格式为:c1xe1+c2xe2+cnxen3、设计思路分析要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为序数coef指数expn指针域next运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于

3、单链表的插入问题(将单链表polyn p中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则: 若p-expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 若p-expn=q-expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 若p-expnq-expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。二、概要设计为实现上述程序的功能,应以带头结点的单链表表示多项式。为

4、此,需要一个抽象数据类型:单链表。2.1单链表的抽象数据类型定义ADT LinkList数据对象:D=ai|aiTermSet,i=1,2,m,m0 TermSet中的每个元素包含一个表示系数的实数和表示指数的整数数据关系:R1=ai-1,aiD且ai-1中的指数值next=null;return ture;void FreeNode(LinkList &p) /释放p所指结点free(q1); q1=q2; q2=q2-next;3.2单链表的基本操作设置如下:void Insert(LinkList p,LinkList h); /将节点p插入到多项式链表hLinkList CreateL

5、inkList(LinkList head,int m);/建立一个头指针为head、项数为m的一元多项式,并返回该多项式的头结点;/若分配空间失败,则返回FALSEvoid DestroyLinkList(LinkList p);/销毁多项式pvoid PrintLinkList(LinkList P);/输出构造的一元多项式PStatus compare(LinkList a,LinkList b) /节点进行比较: a的指数 b的指数 return 1; a的指数=b的指数 return 0;a的指数next=NULL; for(i=0;icoef,&p-expn); Insert(p,

6、head); /调用Insert函数插入结点 return head;/ CreateLinkListStatus compare(LinkList a,LinkList b) if(a&b) if(!b|a-expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a&b) return -1;/a多项式已空,但b多项式非空 else return 1;/b多项式已空,但a多项式非空/ comparefloat ValueLinkList(LinkList head,int x) /输入x值

7、,计算并返回多项式的值 for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) / i 为指数的系数 pow(x,i) if(icoef*t; return sum;/ ValueLinkListLinkList MultiplyLinkList(LinkList pa,LinkList pb)/求解并建立多项式a*b,返回其头指针 LinkList qa=pa-next; LinkList qb=pb-next; hf=(LinkList)malloc(sizeof(struct LNode);/建立头结点 hf-next=NULL; for

8、(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(LinkList)malloc(sizeof(struct LNode); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf); /调用Insert函数以合并指数相同的项return hf;/ MultiplyLinkList3.3主函数和其他函数的伪码算法void main()/主函数Initiation(); /多项式初始化 PrintCommand();/输出菜单 while(1) /循环一直为真 知道选择j|J

9、即退出命令时,程序退出 printf(n请选择操作:); scanf(%c,&flag); Interpter(flag); /具体的操作命令/mainvoid Initiation() printf(请输入a的项数:); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多项式a printf(请输入b的项数:); scanf(%d,&n); pb=CreateLinkList(pb,n);/建立多项式bprintf(多项式已创建n);/ Initiationvoid PrintCommand() /输出菜单显示键入命令的提示信息;Printf(A,B,C,D

10、,E);/ PrintCommandvoid Interpter(char flag) /具体的操作命令 switch(flag) case A: case a: PrintLinkList(pa); break;case B:case b: PrintLinkList(pb); break;caseC: casec: AddLinkList(pa,pb); PrintLinkList(pc); break;caseD: cased: SubtractLinkList(pa,pb);PrintLinkList(pc); break;caseE: casee: DestroyLinkList(p

11、a); DestroyLinkList(pb);exit(0) ;default:printf(n 您的选择错误,请重新选择!n); / Interpter函数说明:Initiation(); /多项式初始化PrintCommand(); /输出菜单Interpter() ; /具体的操作命令PrintLinkList() ; /打印多项式(降序输出)AddLinkList() ; /两个多项式相加SubtractLinkList(); /两个多项式相减DestroyLinkList(); /销毁多项式compare() ; /两个节点比较CreateLinkList(); /创建多项式Ins

12、ert() ; /将节点插入已知多项式中四、源程序#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status; typedef int ElemType;typedef struct LNode float coef; /系数 ElemType expn; /指数 struct LNode *next; LNode,*LinkList;/*全局节点 初始化多项式节点为空*/sta

13、tic LinkList pa=NULL;static LinkList pb=NULL;static LinkList pc=NULL;/*将节点p插入到多项式链表h*/void Insert(LinkList p,LinkList h) if(p-coef=0) free(p); /系数为0的话释放结点 else LinkList q1,q2; q1=h; q2=h-next; while(q2&p-expnexpn) /查找插入位置 q1=q2; q2=q2-next; if(q2&p-expn=q2-expn)/将指数相同相合并 q2-coef+=p-coef; free(p); if

14、(!q2-coef)/系数为0的话释放结点 q1-next=q2-next; free(q2); else /指数为新时将结点插入 p-next=q2; q1-next=p; /创建一元多项式 LinkList CreateLinkList(LinkList head,int m) /建立一个头指针为head、项数为m的一元多项式 int i; LinkList p; p=head=(LinkList)malloc(sizeof(struct LNode); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); /调用Insert函数插

15、入结点 return head;void DestroyLinkList(LinkList p) /销毁多项式p LinkList q1,q2; q1=p-next; q2=q1-next; while(q1-next) free(q1); q1=q2; q2=q2-next; /输出构造的一元多项式Pvoid PrintLinkList(LinkList P) LinkList q=P-next; int flag=1;/项数计数器 if(!q) /若多项式为空,输出0 putchar(0); printf(n); return; while(q) if(q-coef0&flag!=1) p

16、utchar(+); /系数大于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); 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) prin

17、tf(-X); else printf(-X%d,q-expn); q=q-next; flag+; printf(n);/ 节点进行比较/ a的指数 b的指数 return 1/ a的指数=b的指数 return 0/ a的指数expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a&b) return -1;/a多项式已空,但b多项式非空 else return 1;/b多项式已空,但a多项式非空LinkList AddLinkList(LinkList pa,LinkList pb)

18、/求解并建立多项式a+b,返回其头指针 LinkList qa=pa-next; LinkList qb=pb-next; LinkList headc,hc,qc; hc=(LinkList)malloc(sizeof(struct LNode);/建立头结点 hc-next=NULL; headc=hc; while(qa|qb) qc=(LinkList)malloc(sizeof(struct LNode); switch(compare(qa,qb) case 1: qc-coef=qa-coef; qc-expn=qa-expn; qa=qa-next; break; case 0

19、: 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时,释放该结点 return headc;LinkList SubtractLinkList(LinkList pa,LinkList pb)/求解并建立多项式a-b,返回其头指针

20、 LinkList h=pb; LinkList p=pb-next; LinkList pd; while(p) /将pb的系数取反 p-coef*=-1; p=p-next; pd=AddLinkList(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数 p-coef*=-1; return pd;/多项式初始化void Initiation() int m, n ; printf(请输入a的项数:); scanf(%d,&m); pa=CreateLinkList(pa,m);/建立多项式a printf(请输入b的项数:); scanf(%d,&n);

21、pb=CreateLinkList(pb,n);/建立多项式b printf(多项式已创建n); /输出菜单void PrintCommand() printf( A:输出多项式a B:输出多项式b n); printf( C:输出a+b D:输出a-b n); printf(E:退出程序 n);void Interpter(char flag) int x ; scanf(%c,&flag); switch(flag) case A: case a: printf(n多项式a=); PrintLinkList(pa); break; case B: case b:printf(n多项式b=)

22、; PrintLinkList(pb); break; caseC: casec: pc=AddLinkList(pa,pb); printf(n a+b=); PrintLinkList(pc); break; caseD: cased:pc=SubtractLinkList(pa,pb); printf(n a-b=); PrintLinkList(pc); break; caseE: casee: printf(n 感谢使用此程序!n); DestroyLinkList(pa); DestroyLinkList(pb); exit(0) ; /强制程序退出 default:printf(n 您的选择错误,请重新选择!n); void main() char flag; Initiation(); /多项式初始化 PrintCommand();/输出菜单 while(1) /循环一直为真 知道选择j|J即退出命令时,程序退出 printf(n请选择操作:); scanf(%c,&flag);/空格符号一定要注意 Interpter(flag); /具体的操作命令五、运行结果

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服