ImageVerifierCode 换一换
格式:DOCX , 页数:59 ,大小:393.32KB ,
资源ID:12285610      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12285610.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验报告.docx

1、数据结构实验报告实验1 单链表基本操作实验目的1 熟悉C语言的上机环境,掌握C语言的基本结构。2 定义单链表的结点类型。3 熟悉对单链表的一些基本操作和具体的函数定义。4 通过单链表的定义掌握线性表的链式存储结构的特点。5 熟悉对单链表的一些其它操作实验地点科技图书馆四楼实验内容实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义.程序中的单链表(带头结点)结点为结构类型,结点值为整型。LinkedList LinkedListInit()/* 清空单链表 */void LinkedListClear(LinkedList L)/* 检查单链表是否为空 */int

2、LinkedListEmpty(LinkedList L)/* 遍历单链表 */void LinkedListTraverse(LinkedList L)/* 求单链表的长度 */int LinkedListLength(LinkedList L)/* 从单链表表中查找元素 */LinkedList LinkedListGet(LinkedList L,int i)/* 从单链表表中查找与给定元素值相同的元素在链表中的位置 */int LinkedListLocate(LinkedList L, DataType x)/* 向单链表中插入元素 */void LinkedListInsert(L

3、inkedList L,int i,DataType x)/* 从单链表中删除元素 */void LinkedListDel(LinkedList L,DataType x)/* 用尾插法建立单链表 */LinkedList LinkedListCreat( )程序流程图实验代码#include#includeusing namespace std;#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;/-单链表的存储结构-typedef struct LNode ElemType data;/结点的数据域 str

4、uct LNode *next;/结点的指针域LNode,*LinkList;/-单链表的初始化-Status InitList_L(LinkList &L)/构造一个空的链表L L=new LNode;/生成新结点作为头结点,用头指针L指向头结点 L-next=NULL;/头结点的指针域置空 return OK;/-清空单链表-void MakeEmpty(LinkList L) LNode *q; while(L-next!=NULL) q=L-next; L-next=q-next; free(q); /-求单链表长度-int Length(LinkList L) LNode *p=L-

5、next;int count=0; while(p!=NULL) p=p-next; count+; return count;/-按序号查找-Status GetElem_L(LinkList L,int i,ElemType &e)/在带头结点的单链表L中查找第i个元素 LinkList p; p=L-next;/初始化,p指向第一个结点 int j=1;/j为计数器 while(p&jnext; +j; if(!p|ji)/第i个元素不存在 return ERROR; e=p-data;/取第i个元素 return OK;/-按值查找-int LocateElem_L(LinkList

6、L,ElemType e) /在带头结点的单链表L中查找值为e的元素 LNode* p;int i=0; p=L-next; while(p&p-data!=e)/寻找满足条件的结点 p=p-next;i+; return i+1;/返回L中值为e的元素的位置;查找失败的话返回NULL/-插入-Status ListInsert_L(LinkList &L,int i,ElemType &e) LinkList p=L;int j=0; while(p&jnext; +j; if(!p|ji-1) return ERROR; LinkList s; s=new LNode;/生成新结点s s-

7、data=e;/将结点s的数据域置为e s-next=p-next;/将结点s插入L中 p-next=s; cout插入完成endl; return OK;/-单链表删除-Status ListDelete_L(LinkList &L,int i,ElemType e) LinkList p=L;LinkList q;int j=0; while(p&jnext; +j; if(!(p-next)|ji-1) return ERROR;/i大于表长+1或小于1 q=p-next;/临时保存被删结点的地址以备释放 p-next=q-next;/改变删除结点前驱结点的指针域 e=q-data; d

8、elete q;/释放删除结点的数据域 coute被删除next=NULL;/先建立一个带头结点的空链表 for(int i=n;i0;-i) p=new LNode;/生成新结点 cinp-data;/输入元素值 p-next=L-next; L-next=p;/插入到表头 /-后插法创建链表-正序输入-void CreateList_L(LinkList &L,int n) L=new LNode; LinkList p; L-next=NULL; LinkList r=L;/尾指针r指向头结点 for(int i=0;ip-data; p-next=NULL; r-next=p; r=p

9、;/r指向新的结点 void Display(LinkList L) LNode *p=L-next; cout该单链表为:endl; while(p!=NULL) coutdatanext; coutendl;int main() int choice;int n;int i; ElemType e; LNode *L; cout选项:endl 1.创建setw(10)2.查找setw(10)3.插入setw(10)4.删除setw(10)5.清空setw(10)6.长度setw(10)7.判空setw(10)0.退出endl请选择选项:choice; while(i!=0) switch(

10、choice) case 1: int choice1; InitList_L(L); cout1.前插法 2.后插法endl 请选择插入方式:choice1; switch(choice1) case 1: cout请输入结点个数:n; cout请输入元素值:endl; CreateList_F(L,n); break; case 2: cout请输入结点个数:n; cout请输入元素值:endl; CreateList_L(L,n); break; default: cout输入有误endl; break; break; case 2: int choice1; cout1.按序号查找 2

11、.按值查找endl 请选择查找方式:choice1; switch(choice1) case 1: couti; GetElem_L(L,i,e); cout此结点数据域为:eendl; break; case 2: coute; cout此数据的第一个位置为:LocateElem_L(L,e)endl; break; default: cout输入有误endl; break; break; case 3: couti; coute; ListInsert_L(L,i,e); Display(L); break; case 4: couti; ListDelete_L(L,i,e); Dis

12、play(L); break; case 5: cout该单链表已经被清空endl; MakeEmpty(L); Display(L); break; case 6: cout该单链表的长度为:Length(L)endl; break; case 7: if(Length(L)=0) cout该单链表是空表endl; else cout该单链表不是空表endl; break; case 0: return 0; default: cout输入有误,请重新输入:endl; coutchoice; return 0;实验结果实验分析 在实验过程中,出现了许多大大小小的错误,有的是语法错误,有的是逻

13、辑错误,不过在编程过程中也更加透彻地了解和学习了单链表的存储结构及其函数功能实现,比如计算单链表长度、清空、查找等。还要掌握没函数功能实现的基本思想和程序思路,掌握单链表操作的实质,灵活运用指针。下面是编程过程中遇到的部分错误和解决方法:错误1:出现下列错误的原因是指针使用不恰当,没正确匹配变量的类型,变量p是定义的LinkList类型的,但是我却使用了一个指针,并不是结点类型。解决方法:LinkList *p改为LinkList p错误2:计算长度值比实际值少一个,不合逻辑,原因是在写while循环语句的时候判断条件是结点指针为空即为尾结点,但是没有计算最后一个结点,所以比实际值少了1,需要

14、修改判断条件。错误解决方法:把while(p-next!=NULL)改为while(p!=NULL),这样要到尾结点的下一个位置才会跳出循环,计数正确。错误3:大小写没区分导致运行显示变量未定义,分号缺少,花括号个数不统一,while和if分开的语句的内容没有用括号括起来,逻辑错误使执行结果出错。解决方法:认真仔细,注意细节问题,区分大小写,上下对称匹配。错误4:在使用后插发建立单链表时,发现插入时会导致整个单链表混乱,原因是在编写后插法时,修改指针前没有先保存结点再修改,出现如下错误:解决方法:实验总结上机实验是时间理论的一个必不可少的环节了,数据结构是一种算法思想,建立在我们已有的C语言和

15、C+的知识基础上,只有通过编程实践才能真正将这种算法思想付诸实践。编程过程中能够让我们熟悉学习语法规定、掌握程序设计方法、提高程序开发能力。通过实验我也发现了自己不少的问题,这都是只看书上的程序而没有自己亲身上机编写程序而无法得知的。我主要存在以下的这些缺点:1、 学习耐心与细心不足,如scanf(“%d”,&n);中的“&”有时候会忘了。而在最后输出时又错写成printf(“%d”,&n);从而错误得输出了地址而不是我原来想要的答案。2、 编程思想不够发散,看着题目有时想不出解答的方法,更不用说编写程序来解题了。3、 基本功不够,有些函数的表达不太精通,需要看书来核实,以致耗时较多。4、 知

16、识不够广,有些内容没有学好,不能要用到时及时反映出来,认识程度不够深刻。5、 有时候不够精简,有一点用处不大或者说没有也可以的文字存在。在今后学习中我要更多的动脑,综合运用所学,多看相关东西,多上机练习,增强自学能力,把已会的东西掌握好。实验中我深刻意识到完成程序的编写,决不意味着万事大吉。认为万无一失的程序,实际上机运行时可能会出现很多意想不到的问题。有时编译程序检测出一大堆错误,有时程序能够顺利运行,但是运行结果并不是你预期中想要的。因为开发环境所提供的编译系统无法发现程序逻辑错误,或者是你原来所设计时的理论错误,这就只能靠自己的上机经验来分析判断错误的所在了。所以程序的调试是一个技巧性很

17、强的工作,它可能比编一个程序耗时更多。由此可看出上机实践的重要性。实验2 二叉树基本操作实验目的1 熟悉二叉树结点的结构和对二叉树的基本操作。2 掌握对二叉树每一种操作的具体实现.3 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。4 在二叉树基本操作的基础上掌握对二叉树的一些其它操作的具体实现方法。5 掌握构造哈夫曼树以及哈夫曼编码的方法。实验地点科技图书馆四楼实验内容该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。/* 定义DataType为char类型 */typedef char DataType;

18、/* 二叉树的结点类型 */typedef struct BitNodeDataType data; struct BitNode *lchild,*rchild;BitNode,*BitTree;/* 初始化二叉树,即把树根指针置空 */void BinTreeInit(BitTree *BT)/* 按先序次序建立一个二叉树*/void BinTreeCreat(BitTree *BT)/* 检查二叉树是否为空 */int BinTreeEmpty(BitTree *BT)/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */void BinTraverse(B

19、itTree *BT)/* 求二叉树的深度 */int BinTreeDepth(BitTree BT)/* 求二叉树中所有结点数 */int BinTreeCount(BitTree BT)程序流程图遍历方式前序遍历中序遍历后序遍历层次遍历递归循环调用“根结点左孩子右孩子”循环调用“左孩子根结点右孩子”循环调用“左孩子右孩子根结点”无非递归访问T-data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。T是要遍历树的根指针,先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T-data,再中序遍历T的右子树。T是要遍历树的根指针,

20、先将T入栈,遍历左子树;遍历完左子树返回时,再访问右子树访问p指向的结点,退出队列,如果左子树不空,将左子树入队,右子树不空,将右子树入队实验代码#include#include#includeusing namespace std;/二叉树结点typedef struct BiTNode char data;/数据 struct BiTNode *lchild,*rchild; /左右孩子指针BiTNode,*BiTree;/按先序序列创建二叉树int CreateBiTree(BiTree &T) char data;/按先序次序输入二叉树中结点的值(一个字符),#表示空树 scanf(%

21、c,&data); if(data = #) T = NULL; else T = (BiTree)malloc(sizeof(BiTNode); T-data = data;/生成根结点 CreateBiTree(T-lchild);/构造左子树 CreateBiTree(T-rchild);/构造右子树 return 0;/输出void Visit(BiTree T) if(T-data != #) printf(%c ,T-data); /先序遍历void PreOrder(BiTree T) if(T != NULL) Visit(T);/访问根节点 PreOrder(T-lchild

22、);/访问左子结点 PreOrder(T-rchild);/访问右子结点 /中序遍历 void InOrder(BiTree T) if(T != NULL) InOrder(T-lchild); /访问左子结点 Visit(T); /访问根节点 InOrder(T-rchild); /访问右子结点 /后序遍历void PostOrder(BiTree T) if(T != NULL) PostOrder(T-lchild);/访问左子结点 PostOrder(T-rchild);/访问右子结点 Visit(T);/访问根节点 /* 先序遍历(非递归) 思路:访问T-data后,将T入栈,遍历

23、左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。*/void PreOrder2(BiTree T) stack stack; BiTree p = T;/p是遍历指针 while(p | !stack.empty()/栈不空或者p不空时循环 if(p != NULL) stack.push(p);/存入栈中 printf(%c ,p-data);/访问根节点 p = p-lchild;/遍历左子树 else p = stack.top();/退栈 stack.pop(); p = p-rchild;/访问右子树 /while/* 中序遍历(非递归) 思路:T是要遍历树

24、的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。 先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T-data,再中序遍历T的右子树。*/void InOrder2(BiTree T) stack stack; /p是遍历指针 BiTree p = T; /栈不空或者p不空时循环 while(p | !stack.empty() if(p != NULL) /存入栈中 stack.push(p); /遍历左子树 p = p-lchild; else /退栈,访问根节点 p = stack.top(); printf(%c ,p-data); stack.pop(); /访问右子树 p = p-rchild; /while/后序遍历(非递归)typedef struct BiTNodePost BiTree biTree; char tag;BiTNodePost,*BiTreePost;void PostOrder2(BiTree T) stack stack;

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

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