数据结构实验报告 5Word文件下载.docx
- 文档编号:21981177
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:18
- 大小:102.62KB
数据结构实验报告 5Word文件下载.docx
《数据结构实验报告 5Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告 5Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
lChild,key);
}
elseif(key>
InsertBST(T->
rChild,key);
else
return0;
BiTreeCreateBST(inta[],intn){//创建二叉树函数
BiTreebst=NULL;
inti=0;
while(i<
n){
InsertBST(bst,a[i]);
i++;
returnbst;
intDelete(BiTree&
T)
{
BiTreeq,s;
if(!
(T)->
rChild){//右子树为空重接它的左子树
q=T;
T=(T)->
lChild;
free(q);
}else{
if(!
lChild){//若左子树空则重新接它的右子树
q=T;
T=(T)->
rChild;
}else{
s=(T)->
while(s->
rChild){
q=s;
s=s->
}
(T)->
data=s->
data;
//s指向被删除结点的前驱
if(q!
=T)
q->
rChild=s->
else
lChild=s->
free(s);
}
return1;
}
//删除函数,在T中删除key元素
intDeleteBST(BiTree&
T,intkey){
T)return0;
else{
if(key==(T)->
data)returnDelete(T);
else{
if(key<
data)
returnDeleteBST(T->
intPosttreeDepth(BiTreeT){//求深度
inthr,hl,max;
T==NULL){
hl=PosttreeDepth(T->
lChild);
hr=PosttreeDepth(T->
rChild);
max=hl>
hr?
hl:
hr;
returnmax+1;
else
voidprinttree(BiTreeT,intnlayer){//打印二叉树
if(T==NULL)return;
printtree(T->
rChild,nlayer+1);
for(inti=0;
i<
nlayer;
i++){
printf("
"
);
%d\n"
T->
data);
lChild,nlayer+1);
voidPreOrderNoRec(BiTreeroot)//先序非递归遍历
{
BiTreep=root;
BiTreestack[50];
intnum=0;
while(NULL!
=p||num>
0)
while(NULL!
=p)
{
printf("
%d"
p->
stack[num++]=p;
p=p->
num--;
p=stack[num];
p=p->
\n"
voidInOrderNoRec(BiTreeroot)//中序非递归遍历
printf("
voidPostOrderNoRec(BiTreeroot)//后序非递归遍历
BiTreehave_visited=NULL;
p=stack[num-1];
if(NULL==p->
rChild||have_visited==p->
rChild)
num--;
have_visited=p;
p=NULL;
else
intmain(){//主函数
---------------------二叉排序树的实现-------------------"
intlayer;
inti;
intnum;
输入节点个数:
"
scanf("
%d"
&
num);
依次输入这些整数(要不相等)"
int*arr=(int*)malloc(num*sizeof(int));
for(i=0;
num;
scanf("
arr+i);
BiTreebst=CreateBST(arr,num);
二叉树创建成功!
layer=PosttreeDepth(bst);
树状图为:
printtree(bst,layer);
intj;
intT;
intK;
for(;
;
){
loop:
***********************按提示输入操作符************************:
1:
插入节点2:
删除节点3:
打印二叉树4:
非递归遍历二叉树5:
退出"
j);
switch(j){
case1:
输入要插入的节点:
scanf("
T);
InsertBST(bst,T);
插入成功!
printf("
printtree(bst,layer);
break;
case2:
输入要删除的节点"
K);
DeleteBST(bst,K);
删除成功!
case3:
layer=PosttreeDepth(bst);
case4:
非递归遍历二叉树"
先序遍历:
PreOrderNoRec(bst);
中序遍历:
InOrderNoRec(bst);
后序遍历:
PostOrderNoRec(bst);
case5:
程序执行完毕!
return0;
gotoloop;
return0;
对于第四小问,要储存学生的三个信息,需要把上面程序修改一下,二叉树结构变为
typedefstringSlemType;
SlemTypename;
ElemTypescore;
ElemTypeno;
参数不是key,而是另外三个
T,intno,intscore,stringname){//插入二叉树函数
no=no;
name=name;
score=score;
elseif(no<
no){
lChild,no,score,name);
rChild,no,score,name);
其他含参函数也类似
即可完成50个信息存储
用数组存储50个信息,查看以往代码
iostream>
string>
usingnamespacestd;
classstudent{
private:
stringname;
intob1;
intob2;
intara;
public:
voidset(inta,stringb,intc,intd);
voidshow();
intaverage();
};
voidstudent:
:
set(inta,stringb,intc,intd){
num=a;
name=b;
ob1=c;
ob2=d;
ara=(c+d)/2;
voidstudent:
show(){
cout<
<
学号:
num<
姓名:
name<
科目一:
ob1<
科目二:
ob2<
平均成绩:
ara<
endl;
intstudent:
average(){
returnara;
intmain(){
欢迎来到学生管理系统"
0.查询学号信息:
1.删除学号信息:
2.添加学号新信息"
3.按平均分降序显示所有学生信息"
4.退出"
student*ptr=newstudent[21];
ptr[1].set(1,"
小明"
88,67);
//已存入的学生信息
ptr[2].set(2,"
小李"
68,82);
ptr[3].set(3,"
小王"
68,62);
ptr[4].set(4,"
小陈"
79,82);
ptr[5].set(5,"
小张"
63,82);
ptr[6].set(6,"
小红"
68,73);
ptr[7].set(7,"
小木"
62,77);
ptr[8].set(8,"
小添"
65,86);
ptr[9].set(9,"
小天"
ptr[10].set(10,"
张三"
88,82);
ptr[11].set(11,"
李四"
98,82);
ptr[12].set(12,"
王五"
88,81);
ptr[13].set(13,"
小月"
58,82);
ptr[14].set(14,"
小鑫"
78,80);
ptr[15].set(15,"
小良"
68,92);
ptr[16].set(16,"
小成"
ptr[17].set(17,"
小敏"
98,92);
ptr[18].set(18,"
小问"
88,88);
ptr[19].set(19,"
小文"
48,82);
ptr[20].set(20,"
小瑞"
98,62);
intnumlock;
intj=0;
inti,k,m;
intq,e,r;
stringw;
while
(1){
按0,1,2,3,4进行操作"
cin>
>
numlock;
switch(numlock){
case0:
输入想查询的学号"
i;
if(i==j){
该学号信息已被删除"
break;
ptr[i].show();
case1:
输入想删除的学号"
j;
delete[j]ptr;
删除成功"
case2:
输入想添加的学号信息"
k;
if(k!
=j){
cout<
该学号信息已经存在,添加失败"
break;
重新输入添加的学号"
q;
输入姓名"
w;
输入科目一的成绩"
e;
输入科目二的成绩"
r;
ptr[k].set(q,w,e,r);
case3:
for(m=1;
m<
20;
m++){
for(intn=m+1;
n<
n++){
if(ptr[m].average()<
ptr[n].average()){
studenta;
a=ptr[m];
ptr[m]=ptr[n];
ptr[n]=a;
}}
ptr[m].show();
break;
case4:
谢谢使用"
default:
numberoutof0to4"
}}
三.测试结果
二叉排序树储存数据界面(储存学生信息略)
创建二叉树:
插入节点:
删除节点:
非递归遍历:
退出:
数组储存学生信息界面
分析查找效率:
因为二叉树查找要创建二叉树,而数组查找只创建一个数组,二叉树的创建时间比较长,所以对于数据量较少的情况下数组的查找效率比较高。
但当数据量增加时,二叉树的查找优势就显现出来。
所以数据量越大的时候,二叉树的查找效率越高。
四.总结与改进
这个实验工作量还是很大的,做了很久。
树状图形输出还是不美观,还需要改进。
一开始打算用栈实现非递归,但是根据书里面的伪代码发现部分是在C++编译器里运行不了的(即使补充了头文件和数据的定义),所以之后参考了网上的数组非递归,发现其功能和栈相似。
递归遍历的实现比非递归的遍历真的简单很多。
开始时只看到前三问,所以没有写到储存学生数据的代码,里面还可以用clock()函数加一个计算查找所要数据时间的代码,让二叉树查找与数组查找到效率比较更加直观。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验报告 数据结构 实验 报告