《大数据结构》课程实验报告材料.docx

上传人:b****9 文档编号:26082065 上传时间:2023-06-17 格式:DOCX 页数:49 大小:484.72KB
下载 相关 举报
《大数据结构》课程实验报告材料.docx_第1页
第1页 / 共49页
《大数据结构》课程实验报告材料.docx_第2页
第2页 / 共49页
《大数据结构》课程实验报告材料.docx_第3页
第3页 / 共49页
《大数据结构》课程实验报告材料.docx_第4页
第4页 / 共49页
《大数据结构》课程实验报告材料.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

《大数据结构》课程实验报告材料.docx

《《大数据结构》课程实验报告材料.docx》由会员分享,可在线阅读,更多相关《《大数据结构》课程实验报告材料.docx(49页珍藏版)》请在冰豆网上搜索。

《大数据结构》课程实验报告材料.docx

《大数据结构》课程实验报告材料

4实验一基于二叉链表的二叉树的实现

4.1问题描述

基于二叉链表和队列及其堆栈存储结构,实现二叉链表的二叉树的对数据进行各种必要的操作。

4.2系统设计

1.2.1提供20个功能,分别是:

1.2.2二叉链表的结构试一堆栈和队列的形式进行储存的分别是:

1.2.3在程序中所定义的数据结构有:

 

2.3系统实现

1.3.1InitTree功能

初始二叉链表,传入的是头结点地址。

申请一个存储空间,并用头结点中的首结点指针指向该空间首地址,相应的时间复杂度为1。

具体实现如下:

1.3.2DestroyTree功能

销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。

具体实现如下:

1.3.3CreateBiTree功能

与DestroyBiTree类似但是又有不同,ClearBiTree并不销毁物理空间,而是修改逻辑关系值:

1.3.4ClearBiTree功能

与DestroyBiTree类似但是又有不同,ClearBiTree并不销毁物理空间,而是修改逻辑关系值

1.3.5BiTreeEmpty功能

判空功能,判断表是否为空表。

时间复杂度为1,因为只需判断一次就可以知道是否为空。

实现如下:

1.3.6BiTreeDepth功能

求二叉链表深度的功能,由于创建过程中已经把表长信息包含在头结点中,所以直接调用并显示即可

1.3.7Root(BiTreeT)功能

获取二叉链表的根节点的元素,通过遍历二叉链表中的元素,来逐个判断,时间复杂度为(n)。

1.3.8Value(BiTreeT,TElemTypee)功能

求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。

主要思路是递归算法。

时间复杂度为O(n)。

具体实现如下:

1.3.9Assign功能

求指定元素的后一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。

找到后,把新的数据值赋给所找到的节点。

时间复杂度为O(n)。

具体实现如下:

1.3.10Parent功能

找双亲节点,找到后输出

1.3.11LeftChild功能

查找左孩子,利用递归的算法,与遍历的时间复杂度为相同O(n)

1.3.12RightChild功能

查找右孩子,利用递归的算法,与遍历的时间复杂度为相同O(n)

1.3.13LeftSibling功能

查找节点的左边的堂兄弟的,找到后输出该节点的数据

1.3.14RightSibling功能

查找节点的右边的堂兄弟的,找到后输出该节点的数据

1.3.15InsertChild函数

在二叉链表中插入新的节点

1.3.15DeleteChild功能

删除指定编号的数据元素,传入头结点地址、编号i、表结点类型结构体地址来返回被删除元素内容。

执行前先判断传入的编号是否在可寻找范围内。

执行删除操作之后,进行“移位”运算。

时间复杂度仍为O(n)。

如下:

1.3.16PreOrderTraverse功能

前序遍历二叉链表中的数据,采用先遍历左孩子,再访问根节点,后访问右孩子的思想来实现前序遍历的算法的。

1.3.17InOrderTraverse功能

中序遍历的函数,对二叉链表的数据进行访问,并且利用PreOrderTraverse函数

1.3.18PostOrderTraverse功能

采用后续遍历的思想,利用先序遍历的函数进行

1.3.19LevelOrderTraverse功能

完全遍历二叉链表中的数据,并进行输出的

1.3.20Point功能

定位节点的函数,在需要查找二叉链表二叉树的节点的时候,可以直接调用该函数,进行处理,相应的代码如下

1.3.21FILE*fileOpen功能

读取功能,通过fscanf实现格式化读取,同时结合CreateList函数实现顺序

1.3.22BiTNode*Create(FILE*fp)功能

把二叉链表二叉树的数据写入到文件中去

1.4效率分析

在上面介绍各功能时已经提到时间复杂度的计算了,这里再简单分析一下。

具有同数量级复杂度的功能在实现方法上一般近似。

比如InOrderTraverse,PostOrderTraverse,BiTreeDepth,LevelOrderTraverse

它们都是基于PreOrderTraverse

来设计的,所以效率都是O(n);

而Root,Value,Assign,Parent,LeftChild,RightChild,LeftSibling

RightSibling,InsertChild,DeleteChild

是基于VisitPoint,平均效率为O(n);

InitTreeDestroyBiTree所需信息,所以效率为O

(1);

CreateBiTreeClearBiTreeBiTreeEmpty都要对二叉链表,平均效率为O(n)。

 

实验总结与评价

我做了这个实验发现自己的编程能力很不好,自己的脑袋中有相应的想法和主意,但是因为自己的编程能力很不好也就实现不了自己的想法。

二叉链表的二叉树的时候,实现二叉链表线性的对我来说还可以实现,因为线性的所用到方法和技术,在学习十字链表的时候练习的比较少,实现起来难度是很大。

特别是有了老师给的框架以后,我们要做的任务就是向里面填我们自己写的函数,在填写的过程中,我深深的感受到了,认真的重要性,因为我在写好调试的中发现了很多,因为自己的不小心和在敲代码的过程中的不认真而造成的很不应该的错误,这些错误也给自己在调试的过程中也造成了很大的麻烦,因为是不认真而犯的错误,因此调试的过程中也很不好发现。

对我来说,因为我的C语言的功底很不好,运用指针和链表的能力还没有能达到运用自如,理解深刻的地步,所以在顺序链表的链表的实现中,对我来说是一个很大的挑战,我有很多不会的地方通过自己看书,问室友和上网查询,一点一点的写了出来,肯定现在还是会有很多的问题,但是这也是我一直在努力把它做的更好,在调试的中出现了很多的BUG,自己一个个的慢慢的消除掉了,做出了,现在的程序。

如果问自己的体会,那一定是希望我自己以后多多的动手,把以前C语言的书好好再复习一遍,还有就是把现在正在学习的数据结构的书上各个程序,自己要一个个的敲一遍,练习一下自己的熟悉程度。

总的来说,我对这次的实验是很有感触的。

因为,这次实验让我认识到了,自己的编程能力的低下,如果自己再不下一下功夫的话,那么数据结构的考试自己就十分的危险了。

因此,我要加紧复习C语言的知识和数据结构学过的内容,

争取自己能在接下来的学习中能有些进步。

附录:

参考书《数据结构》(C语言版)严蔚敏吴伟民编著

《C语言程序设计》曹计昌,李开编著

实验心得体会

对于这两次的实验,我自己的体会是很深刻的,也是记忆深刻的。

因为,正是因为这两次的实验深深地让我认识到了自己的水平是多么的低下,以前,自己还有点夜郎自大的认为,自己对所学的东西,自己掌握的还差不多了呢。

但是,经过这次的实验,我真的是清楚的发现自己对所学的知识的掌握还差的很多,自己还有很多的功课要补。

第一,以前无论是学习C语言还是数据结构,我的方法是拿着书本看,还有就是拿着练习本写一写,而自己家上机的实践的时间是非常少的,因为我感觉上机得到的结构一定会和自己想的和写的一样呢,显然,我是错误的,因为在这次的实验里我就发现,即使是书上一模一样的代码,在机子上也是有很大的可能出错的,更不用说是自己写的了,在写线性表,线性链表和二叉链表的时候,我出现了用书上的代码不能用的情况,而且是非常严重的错误。

有些声明和指针的问题会出现很大的不同。

我的体会是,从现在起,重视上机的过程,多书上的程序一定要在机子上跑一下,然后再分析一下,出现这种结果的原因和整个程序的流程。

第二,就是实验的时候的规范的问题,由于,自己写代码没有很好的习惯和规则,于是,在自己写好的程序出现错误后自己不能够很快的找到出现错误的位置,比如,对全局变量声明的时候,全局变量的位置问题,在结构和联合声明指针的时候,指针的形式和指针的命名的形式问题,这些错误都有在自己的实验的过程中出现,而且,也给自己带来了很大的麻烦。

我的体会是,以后再写程序的时候一定遵守一定的规则和习惯,例如关键词的命名习惯,指针的使用形式和结构联合中的一些形式的问题,应该遵循一定的规则和习惯,因为,只有这样的自己在写好的调试和检查的过程中才不会走那么多的弯路,才会把做事的速度提高上去。

最后,就是自己的一些心得体会对这次的实验。

做什么事情都要认真对待,无论事情的大小,因为只有这样自己才会养成认真做事的习惯,这次的数据结构的实验让我深深的意识到了这一点。

附录:

实验三代码:

#include

#include

#include

#include

#include

#defineLIST_INIT_SIZE100

#defineLISTINCREMENT10

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASTABLE-1

#defineOVERFLOW-2

#defineMAX_TREE_SIZE100

typedefintStatus;

typedefintTElemType;//数据元素类型定义,注意这里是整型的,可以使char

typedefTElemTypeSqBiTree[MAX_TREE_SIZE];

SqBiTreebt;

 

typedefstruct{

TElemType*base;

TElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack*S);

StatusPop(SqStack*S,TElemTypee);

StatusPush(SqStack*S,TElemTypee);

StatusStackEmpty(SqStack*S);

//全局变量的声明

char*m_pCharBuf=NULL;

intm_nList[100];

intm_nCount=0;

char*openFileOnlyRead(char*fileName);

voidwriteQuickSortResult(char*pResult);

char*openFileOnlyRead(char*fileName)

{

intnLen=0;

FILE*pFile=fopen(fileName,"r");//打开文件

fseek(pFile,0,SEEK_END);//文件指针移到文件尾

nLen=ftell(pFile);//得到当前指针位置,即是文件的长度

rewind(pFile);//文件指针恢复到文件头位置

//动态申请空间,为保存字符串结尾标志\0,多申请一个字符的空间

m_pCharBuf=(char*)malloc(sizeof(char)*nLen+1);

if(!

m_pCharBuf)

{

perror("内存不够!

\n");

exit(0);

}

//读取文件内容//读取的长度和源文件长度有可能有出入,这里自动调整nLen

nLen=fread(m_pCharBuf,sizeof(char),nLen,pFile);

m_pCharBuf[nLen]='\0';//添加字符串结尾标志

//printf("%s\n",pchBuf);//把读取的内容输出到屏幕

fclose(pFile);//关闭文件

//free(pchBuf);//释放空间

returnm_pCharBuf;

}

//写入排序完成后的结果

voidwriteQuickSortResult(char*pResult)

{

FILE*pFile=fopen("QuickSortResult.txt","w");//打开文件

fputs(pResult,pFile);//写入数据

fclose(pFile);//关闭文件

}

 

typedefstructBiTNode{

TElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

typedefBiTreeQElemType;

typedefstructQNode{

QElemTypedata;

structQNode*next;

}QNode,*QueuePtr;

typedefstructLinkQueue

{QueuePtrfront,rear;

}LinkQueue;

voidInitTree(BiTree*T);

voidDestroyBiTree(BiTree*T);

voidCreateBiTree(BiTree*T);

StatusClearBiTree(BiTreeT);

StatusBiTreeEmpty(BiTreeT);

StatusBiTreeDepth(BiTreeT);

StatusRoot(BiTreeT);

StatusValue(BiTreeT,TElemTypee);

StatusAssign(BiTreeT,TElemTypee,intvalue);

StatusParent(BiTreeT,TElemTypee);

StatusLeftChild(BiTreeT,TElemTypee);

StatusRightChild(BiTreeT,TElemTypee);

StatusLeftSibling(BiTreeT,TElemTypee);

StatusRightSibling(BiTreeT,TElemTypee);

StatusInsertChild(BiTreeT,intLR,BiTreeC);

StatusDeleteChild(BiTreeT,intLR);

StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));

StatusInOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));

StatusPostOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));

StatusLevelOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));

StatusVisit(TElemTypee);

BiTreePoint(BiTreeT,TElemTypes);//返回二叉树中指向元素值为s的结点的指针

voidInitQueue(LinkQueueQ);//构造一个空队列

StatusQueueEmpty(LinkQueueQ);//判断队列是否为空

voidEnQueue(LinkQueueQ,QElemTypee);//插入元素为新的队尾元素

StatusDeQueue(LinkQueueQ,QElemTypee);//删除队头元素

BiTNode*Create(FILE*fp);

FILE*fileOpen();

 

voidmain(void){

inti;

//文件内容读取出来

char*pText=openFileOnlyRead("resource.txt");

printf("%s\n\n",pText);

 

BiTreeT;

FILE*p;

TElemTypee;

intn;

intvalue;

intop=1;

while(op){

system("cls");

printf("\n\n");

printf("MenuforLinearTableOnSequenceStructure\n");

printf("----------------------------------------------------------\n");

printf("1.InitTree11.LeftChild\n");

printf("2.DestroyBiTree12.RightChild\n");

printf("3.CreateBiTree13.LeftSibling\n");

printf("4.ClearBiTree14.RightSibling\n");

printf("5.BiTreeEmpty15.InsertChild\n");

printf("6.BiTreeDepth16.DeleteChild\n");

printf("7.Root17.PreOrderTraverse\n");

printf("8.Value18.InOrderTraverse\n");

printf("9.Assign19.PostOrderTraverse\n");

printf("10.Parent20.LevelOrderTraverse\n");

printf("0.Exit\n");

printf("----------------------------------------------------------\n");

printf("请选择你的操作[0~20]:

");

scanf("%d",&op);

switch(op){

case1:

InitTree(&T);

BiTNode*Create(p);

FILE*fileOpen();

if(!

(T)==NULL)

printf("\n----二叉树初始化成功!

\n");

else

printf("二叉树创建失败!

\n");

getchar();getchar();

break;

case2:

printf("是否要销毁二叉树!

(1为是,0是否)\n");

scanf("%d",&n);

if(n==1)

DestroyBiTree(&T);

elsereturn0;

if(T!

=NULL)

printf("\n----二叉树成功销毁实现!

\n");

else

printf("\n---DestroyList功能待实现");

getchar();getchar();

break;

case3:

//InitTree(&T);

printf("Pleaseinputthechar:

e=\n");

scanf("%d",&e);

CreateBiTree(T);

if((T)!

=NULL)

printf("\n----CreateBiTree功能实现!

\n");

else

printf("\n----CreateBiTree功能待实现!

\n");

getchar();getchar();

break;

case4:

ClearBiTree(T);

if(T)

printf("\n----ClearBiTree功能待实现!

\n");

else

printf("\n----ClearBiTree功能实现!

\n");0-

getchar();getchar();

break;

case5:

BiTreeEmpty(T);

if(T)

printf("\n----BiTreeEmpty功能实现!

\n");

else

printf("\n----BiTreeEmpty功能待实现!

\n");

getchar();getchar();

break;

case6:

BiTreeDepth(T);

if(T)

printf("\n----BiTreeDepth功能实现!

\n");

else

printf("\n----BiTreeDepth功能待实现!

\n");

getchar();getchar();

break;

case7:

Root(T);

if(T)

printf("\n----Root功能实现!

\n");

else

printf("\n----Root功能待实现!

\n");

getchar();getchar();

break;

case8:

printf("Pleaseinputthenodeofyouwant:

e=\n");

scanf("%c",&e);

Value(T,e);

if(T==NULL)

printf("\n----Value功能实现!

\n");

else

printf("\n----Value功能待实现!

\n");

getchar();getchar();

break;

case9:

printf("Pleaseinputthenodeandnumberofyouwant:

e=\nvalue=\n");

scanf("%c%d",&e,&value);

Assign(T,e,value);

if(T==NULL)

printf("\n----Assign功能实现!

\n");

else

printf("\n----Assign功能待实现!

\n");

getchar();getchar();

break;

case10:

printf("Pleaseinputthenodeofyouwant:

e=\n");

scanf("%c",&e);

Parent(T,e);

if(T==NULL)

printf("\n----Parent功能实现!

\n");

else

printf("\n----Parent功能待实现!

\n");

getchar();getchar();

break;

case11:

printf("Pleaseinputthenodeofyouwant:

e=\n");

scanf("%c",&e);

LeftChild(T,e);

if(T!

=NULL)

printf("\n----LeftChild功能实现!

\n");

e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1