tc->next=newnodeRETURNpc.
代码编写(仅填写关键代码):
单链表部分:
//返回表头指针
node*getHeadPoint();
//逐个添加链表元素,尾部添加
voidappend(intelement);
//从首部添加链表元素
voidaddasFirst(intelement);
//从指定位置将元素生成节点添加链表,如从链表第location==2个元素后,添加element==23
voidaddAfter(intelement,intlocation);
//删除指定链表元素值大小的所有结点
voidremove(intelement);
//打印所有链表元素值
voidprintAll();
栈部分:
voidPush(constT&item)
TPop()
voidClear(void)
intIsEmpty(void)const
队列部分:
voidinitSqueue(Squeue*);
voidemptySqueue(Squeue*);
voidfullSqueue(Squeue*);
voidInsqueue(Squeue*,int);
voidOutsqueue(Squeue*,int*);
voidPrintSqueue(Squeue*);
多项式部分关键代码:
voidInitList(PolyNode*&L)//初始化多项式单链表,生成一个头结点
voidInsertNode(PolyNode*&L,floatc,inte,inti)//在多项式链表的第i个位置插入结点
voidprint(PolyNode*L)//打印多项式
voidCreateList(PolyNode*&L,floatC[],intE[],intn)//创建多项式单链表
PolyNode*AddPoly(PolyNode*L1,PolyNode*L2)//一元多项式相加
程序调试过程记录:
1、从结尾添加结点,忘记了返回头指针,导致接下来的程序不能运行。
2、删除结点时,对于重复结点欠考虑,导致了很严重的问题。
包括:
删不了头,删不了两个头,当两个重复节点相邻时,只能删除一个,都是逻辑问题。
在第一次运行时均没有发现。
后来单独写了删除头结点的代码并判断,删除重复节点后直接执行下按一次循环(continue),解决了这些问题。
3、发现只有逻辑删除没有物理删除,又在加入了delete。
4.多项式创建出现问题,重新调整类的结构,定义了不同的数组。
测试数据设计:
单链表:
创建链表,用头、尾、选择插入各个方法依次插入并输出检测。
删除时,删除:
不存在的一个数,头,双头,中间,双中间,尾,双尾。
(双意思是重复的数据)
充分考虑到这些问题。
依次测试。
栈:
测试压栈。
弹栈。
弹空栈。
队列:
测试入队。
出队。
出空队.
多项式:
测试多项式的创建和加法
测试结果记录:
单链表:
栈:
队列:
多项式:
实验过程总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法):
删除结点时,在尾节点删除会经常遇到指针空导致程序崩溃。
现在在对尾结点进行操作的时候,多了保护指针。
姓名
胡锐
学号
54160317
实验项目
第二次上机
实验性质
□演示性实验□验证性实验
操作性实验□综合性实验
实验地点
计算机楼A108
机器编号
指导教师
江丽
实验时间
2017年12月1日时分
一、实验目的及要求
题目1:
二叉树相关算法的实验验证
1)从文件创建一棵二叉树,
2)先根、中根、后根遍历二叉树;
3)在二叉树中搜索给定结点的父结点;
4)搜索二叉树中符合数据域条件的结点;
5)从二叉树中删除给定结点及其左右子树。
题目2(选作):
森林的遍历算法的实验验证
1)创建森林;
2)森林的先根遍历的递归和迭代算法;
3)森林的后根遍历的递归和迭代算法;
4)森林的层次遍历算法。
二、实验设备、软件
PC,windows 10Professional,VS2015
三、实验过程(算法设计、代码编写、程序调试、测试数据设计、测试、报告撰写)
基本数据结构选择及算法设计:
1、在二叉树中搜索给定节点的父节点
Father1.[t=NULL?
]
IFt=NULLTHEN(q<-NULL.RETURN.)
Father2.[t为所求?
]
IFLeft(t)=pORRight(t)=pTHEN(q<-t.RETURN.)
Father3.[递归]
Father(Left(t),p.qL)
IFqL!
=NULLTHEN(q<-qL.RETURN.)
ELSEFather(Right(t),p.qR.RETURN.)
2、搜索二叉树中符合数据域条件的节点(递归)
3、从二叉树中删除给定结点及其左右子树
DST1.[t=NULL?
]
IFt=NULLTHEN(RETURN.)
IFData(t)=itemTHEN(q<-t.RETURN.)
DST2.[t=root?
]
IFt=rootTHEN(Del(t).root<-NULL.RETURN)
Find(Right(t),item.p)
RETURN.
DST3.[找t的父节点q]
p<-t.Father(root.p.q)
DST4.[修改q的指针域]
IFLeft(q)=pTHENLeft(q)q=NULL.
IFRight(q)=pTHENRight(q)q=NULL.
DST5.[删除p及其子树]
Del(p).
3、删除结点p及其左右子树(递归)
5、先根遍历算法(递归)
6、中根遍历算法(递归)
7、后根遍历算法(递归)
8、创建二叉树
CBT1.[读数据]
ifstreamfin("text.txt");
CBT2.[p=stop?
]
IFp=stopTHEN(t=NULL.RETURNt.)
CBT3.[构造左子树]
CBT(Left(t)).
CBT4.[构造右子树]
CBT(Right(t)).
代码编写(仅填写关键代码):
●题目1
//先根遍历并输出以节点t为根节点的子树
voidPreOrder(BinTreeNode*t)
//中根遍历并输出以节点t为根节点的子树
voidInOrder(BinTreeNode*t)
//后根遍历并输出以节点t为根节点的子树
voidPostOrder(BinTreeNode*t)
BinTreeNode*BinTree:
:
Create()
//找到父节点
BinTreeNode*Father(BinTreeNode*t,BinTreeNode*p)
//寻找结点
BinTreeNode*Find(BinTreeNode*t,constT&item)
●题目2
程序调试过程记录:
1、文件输入出错。
输入值为12453.然而过程中跳过了第一个数,意识到是指针出了问题。
以下是错误代码和运行结果,其中第一位1并未输入到数组s中。
while((fin.get())!
=EOF){fin>>s[i];i++;}
更改了操作顺序,使用了dowhile。
更改后:
do{fin>>s[i];
i++;
}while((fin.get())!
=EOF)
测试成功
测试数据设计:
构建一棵二叉树如图所示:
构建好之后先根中根后根遍历输出。
中间两个地址是先取某一个点的地址,然后寻找他孩子节点的父节点,测试父节点寻找函数,地址相同证明寻找正确。
删除2及其子树后,二叉树仅剩下13,输出正确。
测试结果记录:
实验过程总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法):
题目1:
程序运行比较稳定,功能基本实现。
题目2:
功能基本实现。
遇到的问题及解决办法见调试经过记录。
姓名
胡锐
学号
54160317
实验项目
第三次上机
实验性质
□演示性实验□验证性实验
操作性实验□综合性实验
实验地点
计算机楼A108
机器编号
指导教师
江丽
实验时间
2017年12月1日时分
一、实验目的及要求
题目1:
邻接矩阵存储的图及相关算法的实验验证
实验验证如下算法的正确性、各种功能及指标:
1)创建一个邻接矩阵存储的图;
2)返回图中指定边的权值;
3)查找图中某顶点的所有邻接顶点;
4)图的深度优先遍历;
题目2邻接表存储的图相关算法的实验验证
1)创建一个邻接表存储的图;
2)返回图中指定边的权值;
3)插入操作:
向图中插入一个顶点,插入一条边;
4)删除操作:
从图中删除一个顶点,删除一条边;
6)图的广度优先遍历;
7)基于迪杰斯特拉算法求最短路径。
【选做题】
二、实验设备、软件
PC,windows 10Professional,VS2015
三、实验过程(算法设计、代码编写、程序调试、测试数据设计、测试、报告撰写)
基本数据结构选择及算法设计:
题一、
图形结构,链式栈结构。
深度优先遍历中采用一个堆栈S来存储访问过程,使用迭代算法。
当顶点进栈后,visited【v】置1,初始时,其实顶点v0入栈,其对应的迭代过程如下:
(1)检测栈是否为空。
若空,结束。
(2)栈中弹出一个顶点v,访问v
(3)将v未被访问的邻接顶点压入栈,并置1
(4)执行
(1)
题二、
图形结构,队列结构。
广度优先遍历中采用一个队列来存储访问过程,使用迭代算法。
当顶点出队后,visited【v】置1,初始时,其实顶点v0入队,其对应的迭代过程如下:
(1)检测队列是否为空,空,结束
(2)初始化后入队第一个元素
(3)从队中弹出一个结点,访问
(4)执行
(1)
代码编写(仅填写关键代码):
●题目1
intGetNextNeighbor(constintv1,constintv2)
intGetWeight(constint&v1,constint&v2)
intGetFirstNeighbor(constintv)
voidDFS_self(constintv)
●题目2
intgetweight(constint&v1,constint&v2);//权重
intgetfirstneighbor(constintv);//得到第一个
intgetnextneighbor(constintv1,constintv2);//查找图中某顶点的所有邻接顶点
voidinsterVertex(constint&v);//添加顶点
voidinsterEdge(constintv1,constintv2,intweight);//添加边
voiddeleteVertex(constint&v);//删除顶点
voiddeleteEdge(constintv1,constintv2);//删除边
voiddeleteEdge1(constintv1,constintv2);//删除边
voidBFS(constints);//广度优先
voidDShortestPath(constintv);//最短路径问题
voidprint();//输出图
程序调试过程记录:
1、大多按照书上内容调试,整体过程程序均可以运行,析构函数运行时会出现指针置空,编译器会调整好,不影响程序运行
测试数据设计:
一、构建一个图:
然后测试11,01,03,之间的权值为0,1,1.并且以3为起点遍历为3201,结果正常。
2、构建一个图:
结果记录:
实验一:
实验二:
实验过程总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法):
题目1:
程序运行比较稳定,功能基本实现。
题目2:
功能基本实现。
遇到的问题及解决办法见调试经过记录。