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

上传人:宝路 文档编号:22513568 上传时间:2017-11-27 格式:DOC 页数:12 大小:147.62KB
返回 下载 相关 举报
数据结构(C语言)一元稀疏多项式计算器_第1页
第1页 / 共12页
数据结构(C语言)一元稀疏多项式计算器_第2页
第2页 / 共12页
数据结构(C语言)一元稀疏多项式计算器_第3页
第3页 / 共12页
数据结构(C语言)一元稀疏多项式计算器_第4页
第4页 / 共12页
数据结构(C语言)一元稀疏多项式计算器_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《数据结构(C语言)一元稀疏多项式计算器》由会员分享,可在线阅读,更多相关《数据结构(C语言)一元稀疏多项式计算器(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

3、 h 分别表示两个一元多项式a 和 b,a+b 的求和运算等同于单链表的插入问题(将单链表 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插

4、入在结点 p 之前,且令指针 q 在原来的链表上后移。二、概要设计为实现上述程序的功能,应以带头结点的单链表表示多项式。为此,需要一个抽象数据类型:单链表。2.1 单链表的抽象数据类型定义ADT LinkList数据对象:D=ai|aiTermSet,i=1,2,m,m0TermSet 中的每个元素包含一个表示系数的实数和表示指数的整数数据关系:R1=ai-1,aiD 且 ai-1 中的指数值next=null;return ture;void FreeNode(LinkList &p) /释放 p 所指结点free(q1);q1=q2;q2=q2-next;3.2 单链表的基本操作设置如下:

5、void Insert(LinkList p,LinkList h);/将节点 p 插入到多项式链表 hLinkList CreateLinkList(LinkList head,int m);/建立一个头指针为 head、项数为 m 的一元多项式,并返回该多项式的头结点;/若分配空间失败,则返回 FALSEvoid DestroyLinkList(LinkList p);/销毁多项式 pvoid PrintLinkList(LinkList P);/输出构造的一元多项式 PStatus compare(LinkList a,LinkList b)/节点进行比较: a 的指数 b 的指数 re

6、turn 1; a 的指数=b 的指数 return 0;a 的指数next=NULL;for(i=0;icoef,&p-expn);Insert(p,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 retur

7、n 1;/b 多项式已空,但 a 多项式非空/ comparefloat ValueLinkList(LinkList head,int x) /输入 x 值,计算并返回多项式的值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 q

8、b=pb-next;hf=(LinkList)malloc(sizeof(struct LNode);/建立头结点hf-next=NULL;for(;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(

9、)/主函数Initiation(); /多项式初始化PrintCommand();/输出菜单 while(1) /循环一直为真 知道选择 j|J 即退出命令时,程序退出printf(n 请选择操作:);scanf(%c,&flag); Interpter(flag); /具体的操作命令 /mainvoid Initiation()printf(请输入 a 的项数:);scanf(%d,&m);pa=CreateLinkList(pa,m);/建立多项式 aprintf(请输入 b 的项数:);scanf(%d,&n);pb=CreateLinkList(pb,n);/建立多项式 bprintf

10、(多项式已创建n);/ Initiationvoid PrintCommand() /输出菜单显示键入命令的提示信息;Printf(A,B,C,D,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: Subtract

11、LinkList(pa,pb);PrintLinkList(pc); break;caseE: casee: DestroyLinkList(pa); DestroyLinkList(pb);exit(0) ; default:printf(n 您的选择错误,请重新选择!n); / Interpter函数说明:Initiation(); /多项式初始化PrintCommand(); /输出菜单Interpter() ; /具体的操作命令PrintLinkList() ; /打印多项式(降序输出)AddLinkList() ; /两个多项式相加SubtractLinkList(); /两个多项式

12、相减DestroyLinkList(); /销毁多项式compare() ; /两个节点比较CreateLinkList(); /创建多项式Insert() ; /将节点插入已知多项式中四、源程序#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 LNodefloat coef; /系数ElemTy

13、pe expn; /指数 struct LNode *next; LNode,*LinkList;/*全局节点 初始化多项式节点为空 */static 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;

14、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;/创建一元多项式 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 函数插入结点 return head;void DestroyLinkList(LinkList p)/销毁多项式 pLinkList q1,q2;q1=p-next;q2=q1-next;while(q1-next)free(q1);q1=q2;q2=q2-next;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号