数据结构课程设计1210522.docx
- 文档编号:29925965
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:18
- 大小:383.41KB
数据结构课程设计1210522.docx
《数据结构课程设计1210522.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计1210522.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计1210522
数据结构课程设计
实习报告
题目:
用链表实现多项式的基本操作
学号:
1210522
姓名:
何厚华
年级:
大二
学院:
计算机与控制工程学院
专业:
计算机科学与技术
完成日期:
2014年3月22日
授课教师:
辛运帏
目录
1.题目.................................................2
2.要求.........................................................................2
3.程序实现...............................................................2
3.1程序运行及编译环境................................................2
3.2程序描述...................................................2
3.3实现功能.......................................................3
3.3.1子功能模块1......................................................4
3.3.1.1输入项.....................................................6
3.3.1.2输出项.....................................................6
3.3.1.3数据结构的定义.............................................6
3.3.1.3.1全局数据结构............................................6
3.3.1.3.2局部数据结构.............................................6
3.3.1.4算法及程序说明................................................7
3.3.1.5接口设计......................................................8
3.3.2子功能模块2.....................................................10
3.4运行结果...........................................................11
3.5尚未解决的问题..........................................................12
1.题目利用链表实现多项式的基本操作
2.要求
链表中,各结点按指数升幂或降幂排列,生成的结果多项式仍使用原多项式所占用的存储空间:
两个同类项相加或相减时,如果系数不为0,则修改该结点的系数值,而指数值不变,将该结点链入结果多项式中,而另一项则释放空间;如果系数为0,则这两项占用的空间均需释放。
不同类项则直接放入结果多项式中。
3.程序实现
3.1程序运行及编译环境
程序是用VisualStudio2008即VS9.0编译的。
可以在windows系列的操作系统上运行。
3.2程序描述
改程序主要用于多项式的四则运算和微分运算。
其流程如下:
A).程序读取输入文件
a.逐个字符读取文件inputfile.txt的内容放到字符变量str里面,遇数字字符和字符
区别对待。
b.将每个数字作为相应的系数或者指数,组成一个结点
c.将结点一个一个地插入到链表类对象myPoly1
d.重复以上步骤,得到myPoly2
e.读取第三行的操作符,并将其数字化
B).控制台输出多项式
Poly类里面封装好了多项式的输出函数,用的是重载运算符”<<”的方法,用此方法
依次输出myPoly1和myPoly1。
C).多项式运算
根据输入文件的操作符,执行相应的运算。
D).在控制台以及文件里依次输出结果。
E).完成
3.3实现功能
3.3.1子功能模块1
fout.open("outfile.txt");//存放输出多项式的文件
fin.open("inputfile.txt");//存放输入多项式的文件
fin.get(str);//逐个字符读取
while(!
fin.eof()){
judge=0;//judge用来判断当前的这两个node->coef还有node->index是否可以用于插入,
//judge=1,时插入
if(crlf==1&&str=='\n'){//crlf用来判定出现过回车换行的次数,因为第一行是myPoly1
//的数据,第二行是myPoly2,第三行是操作符
fin.get(str);
switch(str){//对第三行的符号数字化
case'+':
case'a':
case'A':
sign=1;
break;
.....................
......................
case.......
default:
}
}
if(dot!
=0)//dot用来记录小数点到该数字结束部分的位数
{
dot++;
}
if(str=='\n')
{
crlf++;//换行书加1
}
if((str>'0'||str=='0')&&(str<'9'||str=='9')||str=='-'||str=='.')//对数字,负号还有小数点处理
{
.................
..................
}
if(str==',')//因为”,”总出现在node->coef的后面,此时表示node->coef已经初步生产
{
while(dot>2)//把小数点的位置考虑进去
{
num/=10;
dot--;
}
num=(harsh==1)?
-num:
num;//harsh表示负号的出现情况,harsh=1表明这个是负数
node->coef=num;
num=dot=0;
harsh=judge=0;//harsh置零,此时还没有生成指数,所以judge=0
}
if(str==')')//因为”)”总出现在node->index的后面,此时表示node->index已经初步生产
{
while(dot>2)
{
num/=10;
dot--;
}
num=(harsh==1)?
-num:
num;
node->index=num;
num=dot=0;
judge=1;//judge=1表示指数以及系数均生成,下一个步骤就是插入
harsh=0;//harsh置零
}
if(judge==1&&crlf==0)
myPoly1.insert(node);//第一行就插入多项式myPoly1
if(judge==1&&crlf==1)
myPoly2.insert(node);//第二行就插入多项式myPoly2
fin.get(str);
}
3.3.1.1输入项
输入项有:
ofstreamfout;//输入流文件
charstr;//str用于读入字符的存储,可以为任意可打印字符
intjudge=0;//judge用于判断从文本读入的node数据是否可以插入链表,
//因为那些数是一个一个的取得的
//有效值为0,1
intharsh=0;//harsh用来判断各个数字前面的是否为负号
//harsh有效值为0,1
intcrlf=0;//crlf用来判定出现过回车换行的次数
//有效值为大于0的所有整数
intsign=0;//sign用来表示多项式的操作表示没有操作,1,2,3,4,5分别表示加,减,乘,除,微分
intdot=0;//dot用来记录小数点的位置
doublenum=0;//临时存放指数以及系数的变量
PNode*node=newPNode;//用于插入到链表的一个项
3.3.1.2输出项
ifstreamfin;//输出流文件
PolymyPoly1,myPoly2;//从文件输出到这两个多项式对象里面
//以类似于10x^0+1x^1-7.7x^2+5x^10+9.3x^31的方式输出
3.3.1.3数据结构的定义
3.3.1全局数据结构
全局数据结构有:
链表myPoly1,myPoly2;
3.3.2局部数据结构
用于插入链表的PNode*node;
3.3.1.4算法及程序说明
A).本程序最重要的是这两个模块:
1.删除具有某个指数的链表项,这个操作十分重要,因为经常遇到两个项目合在一起后就对消的情
况,这还需要把相应的指针项释放掉。
2.把某个项目插入到链表里面。
如果它的次数在原来这个多项式里面出现过,那么就不产生新的结
点。
Tosumup,这就是把一项加到多项式里面去。
这个模块有多重要看看后面的算法就知道了。
B).各个运算的算法
a).加法
有了上面那个插入函数,加法就变得非常简单了,因为主要的工作还是它完成的。
把myPoly2的每一项取出来再插进myPoly1里面去。
b).减法
有了上面那个加法函数,减法就变得非常简单了
把myPoly2的每一项取出来,再把每一项的系数变为其相反数,然后插进插进myPoly1里面去。
c).乘法
有了上面那个加法函数,乘法也是非常简单的。
这需要两个循环,依次取出两个多项式的每一项,
然后,相应项的系数相乘,指数相加,形成一个结点,插入到一个空链表里面去,最后空链表成
长为,两个多项式之积。
把myPoly2的每一项取出来,再把每一项的系数变为其相反数,然后插进插进myPoly1里面去。
d).除法就是以上几个运算的简单综合。
比较被除数以及除数最高次数的项,决定商的最高次项,其中指数为被除数指数减去除数指数,系
数,其中系数为被除数系数减去除数系数,依次用被除数减去每一个项与除数的乘积(哈哈,这就
叫站在巨人的肩膀上!
!
),被除数每减一次它的值都会变,因此不用每次减去商与除数的积(不过
e).微分运算
因为它只需要遍历一遍链表,每一项系数指数昨简单变换即可,而不需要像减法,乘法和除法一样
反复调用加法。
刚刚开始写这个模块的时候,不知道调了多少遍了)。
这样,除法就转化为乘法和减法来解决了。
C).体会
这几种算法充分体现了计算机科学里面一种重要的思想:
把未知的问题转化为已知的问题来求解。
因此把基础的几个函数写好,函数才不会崩溃,而且调试起来相对简单。
3.3.1.5接口设计
函数之间的调用关系如下:
switch(sign)
{
case1:
cout<<"ADD"< fout<<"("< fout< break; case2: cout<<"SUB"< fout<<"("< fout< break; case3: cout<<"MUL"< fout<<"("< fout< break; case4: cout<<"DIV"< fout< fout< break; case5: cout<<"DIFF"< fout<<"Thedifferentialof"< fout<<"Thedifferentialof"< break; default: cout<<"Thisoperatorisnotsupported! "< fout<<"Thisoperatorisnotsupported! "< } 3.3.2子功能模块2 boolis_empty() { if(head==NULL) returntrue; returnfalse; } 这个函数是用于判断链表空与否的,方便插入数据。 3.3.2子功能模块3 由于除法的需要,添加了一个复制一个多项式功能的子程序copy(); 遍历并逐一insert就可以了。 voidcopy(Poly&poly){ poly.travel=poly.head; this->head=this->tail=NULL; PNode*Temp=newPNode; while(poly.travel){ Temp->coef=poly.travel->coef; Temp->index=poly.travel->index; insert(Temp); Temp=newPNode; poly.travel=poly.travel->next; } } 3.4运行结果 上图是两个多项式的相加的结果,从上到下依次为输入文件,输出文件和控制台输入输出。 值得一提的是,经过一定的处理,可以处理系数是浮点数的情形,就是对小数点的处理。 另外,就是对这些运算符进行了重载,使得输入输出直观化。 如下图所示。 3.5尚未解决的问题 1.由于时间问题,像2*x^0这样的式子输出的是2*x^0而 不是一个常数2。 2.由于加减乘除微分均会影响原多项式的值,所以要同时在控制台输出和文件流有一定难度。 目前还 没有实现除法的这两种输出方式,所以只在文件流里输出。 这个可以再用文件流的形式来读出实现。 3.还有一些未发现的bug没有修改。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 1210522