数据结构试验报告.docx
《数据结构试验报告.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构试验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/20/5da40efa-f14f-40e8-be44-afeb8c9c13cf/5da40efa-f14f-40e8-be44-afeb8c9c13cf1.gif)
数据结构试验报告
华北电力大学科技学院
实验报告
实验名称数据结构试验
课程名称数据结构
专业班级:
网络10K1学生姓名:
meter
学号:
10902030125成绩:
指导老师:
张琦实验日期:
2013年3月
实验一顺序表及其应用
一、实验目的及要求
1、实验目的
(1)熟悉VC++上机环境,进一步掌握C语言的结构特点。
(2)掌握线性表的顺序存储结构的定义及C语言实现。
(3)掌握线性表在顺序存储结构即顺序表中的各种基本操作的实现。
(4)掌握栈和队列的顺序表示和实现。
2、实验要求
(1)用顺序存储结构实现栈和循环队列。
(2)编写完整程序完成下面的实验内容并上机运行。
(3)整理并上交实验报告。
二、实验内容
1.约瑟夫环的实现:
设有n个人围坐在圆桌周围,现从某个位置i上的人开始报数,数到m的人就站出来。
下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。
依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。
由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus问题。
例如:
当n=8,m=4,i=1时,得到的新序列为:
4,8,5,2,1,3,7,6
编写程序选择顺序存储方式模拟整个过程,并依次输出出列的各人的编号。
三.源程序:
#include
usingnamespacestd;
#defineMax101
intmain()
{inti,k,out,all,count,start;
intperson[Max];//定义保存每个人的数组
cout<<"-------------------¥¥¥¥¥欢迎进入约瑟夫游戏¥¥¥¥¥--------------------"<cout<<"Bymeter!
"<cout<cout<cout<<"请输入游戏人数(最大为100):
"<cin>>all;
cout<<"请输入要数的人数个数:
"<cin>>count;
cout<<"请输入开始数的位置:
"<cin>>start;
for(i=1;i<=all;i++)
person[i]=i;//初始化数
cout<<"循环队列初始化完成。
"<for(inti=1;i<=all;i++)
cout<cout<i=start;
if(start>all)//若开始人数大于总人数提示出错
cout<<"error!
\n";
k=0;//123的计数器
out=0;//出局的人数
while(out{if(person[i]!
=0)//取出后置零
k++;//计数器加一
if(k==count)
{cout<person[i]=0;//出局后此位置置零
k=0;//计数器置零
out++;//出局人数加一}
i++;//人数后移加一
if(i==all+1)i=1;//当i=最后一个时,让i等于第一
}
for(i=1;i<=all;i++)//循环输出最后一个人
{
if(person[i]!
=0)//判断是否已经输出过
{
cout<break;}}
cout<<"\n";
system("pause");
return0;
}
四.实验结果:
实验二链表及其应用
一、实验目的及要求
1、实验目的
(1)熟悉VC++上机环境,进一步掌握C语言的结构特点。
(2)掌握线性表的链式存储结构即单链表的定义及C语言实现。
(3)掌握线性表在链式存储结构即单链表中的各种基本操作。
(4)掌握栈和队列的链式存储结构的表示和实现。
2、实验要求
(1)用链式存储结构实现单链表(和单向循环链表)的建立、查找和删除等运算。
(2)编写完整程序完成下面的实验内容并上机运行。
(3)整理并上交实验报告。
二、实验内容
1.约瑟夫环的问题:
设有n个人围坐在圆桌周围,现从某个位置i上的人开始报数,数到m的人就站出来。
下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。
依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。
由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus问题。
例如:
当n=8,m=4,i=1时,得到的新序列为:
4,8,5,2,1,3,7,6
用单向循环链表存储结构模拟此过程。
三源程序:
#include
usingnamespacestd;
#include
#include
typedefstructNode
{
intdata;
structNode*next;
}*Pointer;//声明链表结构
PointercreatList(Pointerhead,intx)//创建链表
{inti;
Pointerp,q;
head=newNode;//申请空间
head->data=x;//修正让第一个节点的data值为最大
p=head;//p为辅助指针指尾节点
for(i=1;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(){
cout<<"-------------------¥¥¥¥¥欢迎进入约瑟夫游戏¥¥¥¥¥--------------------"<cout<<"《循环链表实现》"<cout<<"Bymeter!
"<cout<cout<intall,count,start,i,j,out;
PointerNode,point,previous,pointer;
Node=NULL;//初始化节点
cout<<"请输入参加游戏总人数\n";
cin>>all;
Node=creatList(Node,all);//创建链表
cout<<"请输入周期\n";
cin>>count;
cout<<"请输入起始位置\n";
cin>>start;
if(start>all)//溢出出错提示
cout<<"error\n";
else
{
cout<<"总人数为:
"<cout<<"周期:
"<cout<<"起始位置:
"<cout<cout<<"出局的顺序为:
";
point=Node;//point为辅助变量
j=1;//初始化计数器
while(j<=start)
{
previous=point;//前一个指针指向此节点
point=point->next;//此节点指向下一个
j++;//计数器加一
}
out=0;//出局的人数
while(out{
for(j=1;j{
point=point->next;//此节点后移
previous=previous->next;//前节点后移
}
cout<data;//打印输出要出局的人
pointer=point->next;//保留point的接口
del(previous,point);//删除此节点
point=pointer;//重新赋值
out++;//出局的人数加一
}
cout<data;//输出最后一个人
delete(point);//释放此节点
cout<system("pause");
}
return0;
}
四.运行结果:
实验三二叉树
一、实验目的及要求
1、实验目的
(1)通过实验,掌握二叉树的建立与存储
(2)通过实验,掌握二叉树的遍历方法
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
usingnamespacestd;
typedefstructbtnode
{intdata;
structbtnode*Lchild,*Rchild;
}*bitreptr;//声明变量
bitreptrMdPreorder()//先序建立二叉树
{intx;
bitreptrhead;
cout<<"请输入:
";
cin>>x;
if(x==0)head=NULL;
else
{head=newbtnode;//为节点申请空间
if(!
head)cout<<"Error!
";//判断是否申请成功
head->data=x;//赋值给节点的data
head->Lchild=MdPreorder();//左孩子递归调用
head->Rchild=MdPreorder();//右孩子递归调用
}
returnhead;//返回头结点
}
intPreOrder(bitreptrhead)/*先序遍历*/
{if(head!
=NULL)//判断头结点是否为空
{cout<data;//输出数据域
PreOrder(head->Lchild);//递归调用左孩子
PreOrder(head->Rchild);//递归调用右孩子
}
return0;}
intInOrder(bitreptrhead)/*中序遍历*/
{if(head)
{InOrder(head->Lchild);
cout<data;
InOrder(head->Rchild);}
return0;}
intPostOrder(bitreptrhead)/*后序遍历*/
{if(head){
PostOrder(head->Lchild);
PostOrder(head->Rchild);
cout<data;}
return0;
}
intmain()
{bitreptrHead;//申请变量
Head=NULL;//初始化节点
cout<<"☆友情提示:
☆\n\n";
cout<<"☆先序输入一个节点按回车继续下个输入☆\n";
Head=MdPreorder();//建立二叉树
cout<<"先序输出为:
";
PreOrder(Head);//先序输出
cout<<"\n\n";
cout<<"中序输出为:
";
InOrder(Head);//中序输出
cout<<"\n\n";
cout<<"后序输出为:
";
PostOrder(Head);//后序输出
cout<<"\n";
system("pause");
return(0);
}
五.运行结果:
六.实验总结:
1.调试时出现的问题及解决办法:
利用带头结点的尾插法建立链表求解的时候,头节点的作用无法确定,导致编译通过,但是运行之后的结果都不是正确的运行结果。
苦苦思索,包括和同学讨论,一直没能解决,最后决定改用另一种存储方法,将头节点直接改成NULL,最终测试的结果是正确的。
用函数返回存储节点的地址的时候,函数中的一句没有问题的语句出现访问错误,更改函数从而解决了问题。
2.这次做数据结构作业,不仅对开学一段时间内所学的知识有了更好的理解,而且很好地锻炼了自己的编程能力。
发现心中了解程序的主要算法和真正写出来完全不是一回事,一开始做多项式的时候就是先写函数,后定义存储结构等,结果编译报错很多,不知道怎么修改,无奈只好改成做约瑟夫环问题了。
在编程和写报告的过程中曾多次遇到各种各样的问题,通过与同学的交流以及自己独立思考,最终得到解决并顺利的完成了此次作业。
总之一句话,获益良多。