1、数据结构课程设计姓名:杨文杰班级:2013130301专业:计算机科学与技术学号:201313030123实验报告5.31. 实验题目:多元多项式的操作。2. 问题描述:(1)实现多元多项式的求函数值、求偏导函数和加法运算。(2)稀疏多元多项式采用广义表存储;(3)输入要求:输入多元多项式的变元个数,各项按(系数,指数)对输入,可按任意顺序输入各项,相同指数项可以多次输入,由程序合并同类项,以(0,0, ,0)结束输入,建立该多项式的广义表存储结构;例如:输入为3 /变元个数为 33 2 1 3 /3x2yz3-4 1 0 5 /-4xz52 2 0 3 /2 xyz30 0 0 0(4)输出
2、要求:按多项式的形式输出,如上面输入的多项式输出为:(2x+3x2)yz3-4xz5;(5)求多元多项式的函数值:从键盘输入各个变元的当前值;(6)求多元多项式的偏导函数,仍然采用广义表存储,并输出;(7)多元多项式的加、减、乘法运算。3.概要设计(1)存储结构的选择:由于是多元稀疏多项式的基本运算,用顺序表存储浪费存储空间,故采用广义表表示稀疏多项式。用广义表存储多元多项式P(x1,x2,xn),实为按变元 xn 的升幂顺序建立一个带头结点的有序链表,链表中的每个节点结构有两种:(1,exp,hp,tp ),其中 1 表示表结点,即 xn 的系数是一个多项式,hp 指向其系数多项式的链表(也
3、是一个与 xn 的有序表同构的链表),tp 指向 xn 的下一幂次项的结点;(0,coef,exp ,tp ),0 表示原子结点,即 xn 的 exp 幂次项的系数是常数。(2)多项式的结点抽象数据类型:ADT PNode数据对象:D=a i|aiTermSet,i=1,2,3,n,n0,TermSet 中的每个元素是多项式的一项(系数,指数)数据关系:R=|ai-1,aiD,i=2,3,4,n,且 ai-1的指数小于ai 的指数,即按指数递增基本操作:PNode(P);构造一个节点 P。PNode(const PNode 通过 Pa 构造节点 P。PNode 运算符重载ClearNode()
4、;清除节点 P实现多项式的乘法:La*=Lb,并将 Lb 置空。ADT PNode;(3)存放系数指数对的结构体定义:struct Termdouble coef;系数。int expnMAXVAR+1;指数。struct Term;(4)多元多项式的广义表的 ADT 定义:ADT PList数据对象:D=a i|i=2,3,n,n0;a iD0 或者属于某个广义表,D0是某个数据对象数据关系:R=|ai-1,aiD,i=2,3,4,n基本操作:InitPList(建立空的广义表 LS。GreatePList(建立广义表 LS。DestroyPList(销毁广义表 LS。CopyPList(由
5、广义表 L 复制到广义表 LS。PListEmpty(LS);判断广义表 LS 是否是空表。GetHead(LS);取广义表 LS 的表头。InsertInOrder(PNode * 将 pb 头结点后各项插入到 p 中使 P 仍递增有序并合并同类项。PList 重载辅赋值运算符。PList 重载复合赋值运算符。PList 重载复合赋值运算符:La-=Lb。PList 重载复合赋值运算符:La*=Lb。void Derivative();求偏导函数。void Display(PNode *p)const;输出多项式。double Value(PNode *p,double *value);求多
6、项式在 x 处的值 ADT GList4 详细设计(1)广义表结点类:class PNode /多项式的广义表结点类friend class PList; /将广义表类说明为友元类public:int tag; /标志域,原子结点tag=0,表结点tag=1int exp; /指数域PNode *tp; /指向相同层的下一个链接点uniondouble coef; /原子结点使用coef域存放字符PNode *hp; /表结点使用hp指针指向下层单链表的第一个结点PNode():tag(1),tp(NULL),hp(NULL);/构造函数PNode(const PNode PNode(int
7、t,int ex):tag(t),exp(ex),tp(NULL),hp(NULL);PNode /运算符重载void ClearNode();(2)广义表类class PList /多元多项式的广义表类friend PList /重载加法运算friend PList /重载减法运算friend PList /重载乘法运算private:PNode *head; /表头指针void CreateTerm(PNode * /根据x创建不带头结点的广义表void InsertInOrder(PNode * /pb头结点后各项有序插入到p中void CopyPList(PNode *L,PNode
8、* /由广义表L复制得到T递归函数public:PList(int x=0)head=new PNode;head-tag=1;head-exp=x;/构造函数PList(const PList ; /拷贝构造函数PList PList /重载复合赋值运算符PList /重载复合赋值运算符:La-=LbPList /重载复合赋值运算符:La*=Lbvoid MUL(PNode *p,double a);double Value(PNode *p,double *value);void Derivative(); /求偏导函数void Display(PNode *p)const; /输出多项式PNode *Head()return head;void CreatePList();bool IsEmpty()return !head-hp;5.调试分析