数据结构试验报告Word格式.docx
- 文档编号:16171665
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:11
- 大小:43.06KB
数据结构试验报告Word格式.docx
《数据结构试验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
例如:
当n=8,m=4,i=1时,得到的新序列为:
4,8,5,2,1,3,7,6
编写程序选择顺序存储方式模拟整个过程,并依次输出出列的各人的编号。
三.源程序:
#include<
iostream>
usingnamespacestd;
#defineMax101
intmain()
{inti,k,out,all,count,start;
intperson[Max];
//定义保存每个人的数组
cout<
<
"
-------------------¥¥¥¥¥欢迎进入约瑟夫游戏¥¥¥¥¥--------------------"
endl;
Bymeter!
请输入游戏人数(最大为100):
cin>
>
all;
请输入要数的人数个数:
count;
请输入开始数的位置:
start;
for(i=1;
i<
=all;
i++)
person[i]=i;
//初始化数
循环队列初始化完成。
for(inti=1;
cout<
person[i]<
\t"
;
i=start;
if(start>
all)//若开始人数大于总人数提示出错
error!
\n"
k=0;
//123的计数器
out=0;
//出局的人数
while(out<
all)
{if(person[i]!
=0)//取出后置零
k++;
//计数器加一
if(k==count)
{cout<
person[i];
//打印输出该出局的人数
person[i]=0;
//出局后此位置置零
k=0;
//计数器置零
out++;
//出局人数加一}
i++;
//人数后移加一
if(i==all+1)i=1;
//当i=最后一个时,让i等于第一
}
i++)//循环输出最后一个人
{
if(person[i]!
=0)//判断是否已经输出过
{
cout<
break;
}}
system("
pause"
);
return0;
四.实验结果:
实验二链表及其应用
(2)掌握线性表的链式存储结构即单链表的定义及C语言实现。
(3)掌握线性表在链式存储结构即单链表中的各种基本操作。
(4)掌握栈和队列的链式存储结构的表示和实现。
(1)用链式存储结构实现单链表(和单向循环链表)的建立、查找和删除等运算。
1.约瑟夫环的问题:
4,8,5,2,1,3,7,6
用单向循环链表存储结构模拟此过程。
三源程序:
#include<
malloc.h>
stdlib.h>
typedefstructNode
{
intdata;
structNode*next;
}*Pointer;
//声明链表结构
PointercreatList(Pointerhead,intx)//创建链表
{inti;
Pointerp,q;
head=newNode;
//申请空间
head->
data=x;
//修正让第一个节点的data值为最大
p=head;
//p为辅助指针指尾节点
x;
i++)//循环建立链表
{q=newNode;
if(!
q)exit
(1);
//判断是否申请成功
q->
data=i;
//赋值data等于i
p->
next=q;
p=q;
//p指向尾节点}
p->
next=head;
//让尾节点的next域指向头结点
return(head);
//返回头结
voiddel(PointerPrevious,PointerPoint)//删除节点
Previous->
next=Point->
next;
//让要删除的节点的前一个的next域指向要删除节点的next域
free(Point);
//释放节点空间
}
intmain(){
《循环链表实现》"
intall,count,start,i,j,out;
PointerNode,point,previous,pointer;
Node=NULL;
//初始化节点
请输入参加游戏总人数\n"
Node=creatList(Node,all);
//创建链表
请输入周期\n"
请输入起始位置\n"
if(start>
all)//溢出出错提示
error\n"
else
总人数为:
周期:
起始位置:
start<
出局的顺序为:
point=Node;
//point为辅助变量
j=1;
//初始化计数器
while(j<
=start)
previous=point;
//前一个指针指向此节点
point=point->
//此节点指向下一个
j++;
}
all-1)
for(j=1;
j<
j++)
point=point->
//此节点后移
previous=previous->
//前节点后移
}
point->
data;
//打印输出要出局的人
pointer=point->
//保留point的接口
del(previous,point);
//删除此节点
point=pointer;
//重新赋值
out++;
//出局的人数加一
//输出最后一个人
delete(point);
//释放此节点
四.运行结果:
实验三二叉树
(1)通过实验,掌握二叉树的建立与存储
(2)通过实验,掌握二叉树的遍历方法
(1)二叉树需要用二叉链表作为节点类型描述。
(2)二叉树的遍历递归算法能够转换为非递归算法。
(3)编写完整程序完成下面的实验内容并上机运行。
(4)整理并上交实验报告。
1、问题描述
利用先序遍历建立一棵二叉树,并分别用前序、中序、后序遍历该二叉树
2、节点形式
Lchild
data
Rchild
3、说明
(1)输入数据:
1,2,3,0,0,4,0,0,5,0,0其中“0”表示空子树。
(2)输出数据:
先序:
1,2,3,4,5
中序:
3,2,4,1,5
后序:
3,4,2,5,1
三、实验步骤
1.建立自己的头文件BT.H,内容包括二叉链表的结构描述、二叉树的建立、二叉树的先序、中序与后序遍历算法。
2.建立二叉树,并通过调用函数,输出先序遍历、中序遍历与后序遍历的结果。
四.源程序
#include<
typedefstructbtnode
{intdata;
structbtnode*Lchild,*Rchild;
}*bitreptr;
//声明变量
bitreptrMdPreorder()//先序建立二叉树
{intx;
bitreptrhead;
请输入:
cin>
if(x==0)head=NULL;
else
{head=newbtnode;
//为节点申请空间
if(!
head)cout<
Error!
//判断是否申请成功
head->
//赋值给节点的data
Lchild=MdPreorder();
//左孩子递归调用
Rchild=MdPreorder();
//右孩子递归调用
returnhead;
//返回头结点
intPreOrder(bitreptrhead)/*先序遍历*/
{if(head!
=NULL)//判断头结点是否为空
{cout<
head->
//输出数据域
PreOrder(head->
Lchild);
//递归调用左孩子
Rchild);
//递归调用右孩子
intInOrder(bitreptrhead)/*中序遍历*/
{if(head)
{InOrder(head->
InOrder(head->
intPostOrder(bitreptrhead)/*后序遍历*/
{if(head){
PostOrder(head->
{bitreptrHead;
//申请变量
Head=NULL;
☆友情提示:
☆\n\n"
☆先序输入一个节点按回车继续下个输入☆\n"
Head=MdPreorder();
//建立二叉树
先序输出为:
PreOrder(Head);
//先序输出
\n\n"
中序输出为:
InOrder(Head);
//中序输出
后序输出为:
PostOrder(Head);
//后序输出
return(0);
五.运行结果:
六.实验总结:
1.调试时出现的问题及解决办法:
利用带头结点的尾插法建立链表求解的时候,头节点的作用无法确定,导致编译通过,但是运行之后的结果都不是正确的运行结果。
苦苦思索,包括和同学讨论,一直没能解决,最后决定改用另一种存储方法,将头节点直接改成NULL,最终测试的结果是正确的。
用函数返回存储节点的地址的时候,函数中的一句没有问题的语句出现访问错误,更改函数从而解决了问题。
2.这次做数据结构作业,不仅对开学一段时间内所学的知识有了更好的理解,而且很好地锻炼了自己的编程能力。
发现心中了解程序的主要算法和真正写出来完全不是一回事,一开始做多项式的时候就是先写函数,后定义存储结构等,结果编译报错很多,不知道怎么修改,无奈只好改成做约瑟夫环问题了。
在编程和写报告的过程中曾多次遇到各种各样的问题,通过与同学的交流以及自己独立思考,最终得到解决并顺利的完成了此次作业。
总之一句话,获益良多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验报告