云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □学期:2012秋季学期任课教师:实验题目: 一元稀疏多项式计算器小组长:联系电话:电子邮件:完成提交时间:2012 年 11 月 10 日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号: 20111120 姓名:本人承担角色:算法设计整体流程控制综合得分:(满分100分)指导教师:年月日云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号: 20111120 姓名:本人承担角色:函数实现整体流程控制综合得分:(满分100分)指导教师:年月日(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)多项式计算器的呈现方式是用控制台程序呈现,;多项式的加减乘以及求导的函数中利用链表保存头结点以及循环结构保存和输出数据;还有利用一个简单的降序排列的函数,在输出时更加明了。
二、【实验设计(Design)】(20%)在头文件中申明变量,源文件中创建指数和系数的指针的头结点,并为此申请空间。
首先考虑指数为0,1和系数为0,1时的特殊情况的表示;然后利用SORT函数对输出时进行降序排列;其次就是加减乘以及求导函数的实现;最后是一个输出界面的设计。
三、【实现描述(Implement)】(30%)//--------函数原型说明--------typedef struct Node{double xishu;int zhishu;//数据域//int data;struct Node* pnext;//指针域}Node,*pNode;pNode phead=(pNode)malloc(sizeof(Node));//创建头节点pNode creat_list(void);创建链表void traverse_list(pNode phead);//遍历链表pNode sort(pNode phead);//对链表进行降序排列pNode add(pNode phead1,pNode phead2);//两个多项式相加pNode hebing(pNode phead)//合并同类项pNode multi(pNode phead1,pNode phead2);//多项式相乘pNode sub(pNode phead1,pNode phead2);//多项式相减//多项式求导没有声明和定义函数,而是直接卸载程序里了//------关键操作的实现-------1.对链表的声明和定义和对创建函数的定义。
#include"stdafx.h"#include"cpxNum.h"typedef struct Node{double xishu;int zhishu;//数据域//int data;struct Node* pnext;//指针域}Node,*pNode;pNode creat_list(void){int len;int i;//int val;int zhishu;double xishu;pNode phead=(pNode)malloc(sizeof(Node));//分配了一个不存在有效数据的头结点pNode ptail=phead;ptail->pnext=NULL;if(phead==NULL){cout<<"分配失败<<endl;exit(-1);}cout<<"请输入想输入多项式的项数"<<endl;cin>>len;for(i=0;i<len;i++){cout<<"请?输º?入¨?第̨²"<<i+1<<"个?项?的Ì?系¦Ì数ºy的Ì?值¦Ì"<<endl;cin>>xishu;cout<<"请?输º?入¨?第̨²"<<i+1<<"个?项?的Ì?指?数ºy的Ì?值¦Ì"<<endl;cin>>zhishu;pNode pnew=(pNode)malloc(sizeof(Node));if(pnew==NULL){cout<<"分¤?配?失º¡ì败㨹"<<endl;exit(-1);}pnew->xishu=xishu;pnew->zhishu=zhishu;ptail->pnext=pnew;pnew->pnext=NULL;ptail=pnew;}phead->zhishu=len;return phead;}2.对多项式遍历,排序,同类项合并的定义1.多项式的遍历//将多项式分为第一项和其余项两部分考虑,另外考虑指数=0,指数=1,系数=1,系数=0等情况。
void traverse_list(pNode phead){pNode p=phead->pnext;if(p->zhishu==0)cout<<p->xishu;else{if(p->zhishu==1)cout<<"("<<p->xishu<<")"<<"x";else{if(p->xishu==1)cout<<"x"<<"^"<<p->zhishu;else{if(p->xishu==0)cout<<"0";elsecout<<"("<<p->xishu<<")"<<"x"<<"^"<<p->zhishu;}}}p=p->pnext;while(p){ if(p->zhishu==0)cout<<"+"<<p->xishu;else{if(p->zhishu==1)cout<<"x+"<<"("<<p->xishu<<")";else{if(p->xishu==1)cout<<"+"<<"x"<<"^"<<p->zhishu;else{if(p->xishu==0)cout<<"+0";elsecout<<"+"<<"("<<p->xishu<<")"<<"x"<<"^"<<p->zhishu;}}}p=p->pnext;}cout<<endl;return;}2.排序操作。
//通过冒泡排序对多项式进行降序排列。
pNode sort(pNode phead){int i,j;float xishu;int zhishu;pNode p,q,f;f=phead;int len=phead->zhishu;for(i=0,p=phead->pnext;i<len-1;i++,p=p->pnext){for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext){if(p->zhishu<q->zhishu){xishu=p->xishu;zhishu=p->zhishu ;p->xishu=q->xishu;p->zhishu=q->zhishu;q->xishu=xishu;q->zhishu=zhishu;}}}return f;}3.合并排序//通过检查将同类型合并,在加法,减法和乘法函数中会用到pNode hebing(pNode phead){pNode r,q,p,Q;for(q=phead->pnext;q!=NULL;q=q->pnext)//合?并¡é同ª?类¤¨¤项?for(p=q->pnext,r=q;p!=NULL;)if(q->zhishu==p->zhishu)//指?数ºy相¨¤等̨¨ 系¦Ì数ºy相¨¤加¨®{q->xishu=q->xishu+p->xishu;r->pnext=p->pnext;Q=p;p=p->pnext;delete Q;//释º¨ª放¤?p}else{r=r->pnext;p=p->pnext;}return phead;}3.多项式的加,减,乘,求导,x代入值的实现1.多项式的加法//创建一个新链表存储新的多项式,开始对phead1和phead2进行扫描,指数相同就相加。
pNode add(pNode phead1,pNode phead2){pNode p1,p2,pTail,pnew;pNode phead3=(pNode)malloc(sizeof(Node));pTail=phead3;pTail->pnext=NULL;sort(phead1);sort(phead2);p1=phead1->pnext;p2=phead2->pnext;int i=0;while(p1&&p2){if(p1->zhishu>=p2->zhishu){if(p1->zhishu==p2->zhishu){pnew=new Node;pnew->xishu=p1->xishu+p2->xishu;pnew ->zhishu=p1->zhishu;pTail->pnext=pnew;pnew->pnext=NULL;pTail=pnew;p1=p1->pnext;p2=p2->pnext;}else{pnew=new Node;pnew->xishu=p1->xishu;pnew ->zhishu=p1->zhishu;pTail->pnext=pnew;pnew->pnext=NULL;pTail=pnew;p1=p1->pnext;}}else{pnew=new Node;pnew->xishu=p2->xishu;pnew ->zhishu=p2->zhishu;pTail->pnext=pnew;pnew->pnext=NULL;pTail=pnew;p2=p2->pnext;}}if(p1==NULL){pTail->pnext=p2;}if(p2==NULL)pTail->pnext=p1;return phead3;}2.多项式的减法//道理与多项式加法相同,但是指数相同时,系数相减。