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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

单链表的插入和删除实验报告Word文件下载.docx

1、r-next=NULL;Input # to end / 输入“ # ”代表输入结束Please input Node_data: / 输入各结点的字符串 while(strcmp(ch,#)!=0) pp=LocateNode(head,ch); / 按值查找结点,返回结点指 针if(pp=NULL) / 没有重复的字符串,插入到链表 中s=(ListNode *)malloc(sizeof(ListNode); strcpy(s-data,ch);next=s;r=s;return head; / 返回头指针/= 按值查找结点,找到则返回该结点的位置,否则返回 NULL=ListNode

2、*LocateNode(LinkList head, char *key)ListNode *p=head-next; / 从开始结点比较while(p&strcmp(p-data,key)!=0 ) / 直到 p 为 NULL 或p- data 为 key 止p=p- / 扫描下一个结点return p; / 若 p=NULL 则查找失败,否则 p 指向找到的值key 的结点/= 删除带头结点的单链表中的指定结点 = void DeleteList(LinkList head,char *key)ListNode *p,*r,*q=head;p=LocateNode(head,key); /

3、 按 key 值查找结点的 if(p=NULL ) / 若没有找到结点,退出 printf(position errorexit(0);while(q-next!=p) /p 为要删除的结点, q 为 p 的前结点 q=q-r=q-q-next=r-free(r); / 释放结点/= 打印链表 = void printlist(LinkList head) / 从开始结点打印 while(p)%s, ,p-data);nvoid DeleteAll(LinkList head)ListNode *p=head,*r; while(p-next) r=p- free(p);p=r;free(p)

4、;运行结果:/ the insert function加的添加结点的代码: int Insert(ListNode *head)ListNode *in,*p,*q;int wh;input the insert node:in=(ListNode *)malloc(sizeof(ListNode);in-p=(ListNode *)malloc(sizeof(ListNode);q=(ListNode *)malloc(sizeof(ListNode);if(!in)return 0;,in-youinput the place where you want to insertdata:%d

5、,&wh);for(p=head;wh0;next,wh-);q=p-next=in;next=q;return 1;最后提示为 OK 添加成功实验心得:这个实验中 主要修改的是 ch 和 num 把它们由指针改 成数组 因为不改的话在后面 delect 函数中会出现没有地址的情况 找不到地址就不能执行功能 然后把 locate 函数的判断语句改一下 避免矛盾的出现。实验二、二叉树操作目的掌握二叉树的定义、性质及存储方式,各种遍历算法二、 要求采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。三、 程序源代码#includestdi

6、o.hstring.h#define Max 20 / 结点的最大个数typedef struct nodechar data;struct node *lchild,*rchild;BinTNode; / 自定义二叉树的结点类型typedef BinTNode *BinTree; / 定义二叉树的指针/= 基于先序遍历算法创建二叉树 = /= 要求输入先序序列,其中加入虚结点“ # ”以示空指针的位BinTree CreatBinTree(void)BinTree T;char ch;if(ch=getchar()=#)return(NULL); / 读入 #,返回空指针elseT=(Bin

7、TNode *)malloc(sizeof(BinTNode); / 生成结点T-data=ch;lchild=CreatBinTree(); / 构造左子树rchild=CreatBinTree(); / 构造右子树return(T);/=NLR 先序遍历 =void Preorder(BinTree T)if(T) Preorder(T-lchild);rchild);/ 先序遍历左子树/ 先序遍历右子树/=LNR 中序遍历 =void Inorder(BinTree T)/ 中序遍历左子树/ 访问结点/ 中序遍历右子树Inorder(T- printf(%c,T- Inorder(T-/

8、=LRN 后序遍历 = void Postorder(BinTree T)/ 后序遍历左子树/ 后序遍历右子树Postorder(T-/ 求左深度/ 求右深度/ 取左右深度的最大值/ 求结点数/ 若左右深度为 0 ,即为叶子/采用后序遍历求二叉树的深度、结点数及叶子数的递归算法=int TreeDepth(BinTree T)int hl,hr,max;if(T)hl=TreeDepth(T- hr=TreeDepth(T- max=hlhr? hl:hr;NodeNum=NodeNum+1;if(hl=0&hr=0) leaf=leaf+1; return(max+1);else retur

9、n(0);/= 利用 “先 进 先出void Levelorder(BinTree T)int front=0,rear=1;BinTNode *cqMax,*p; / 定义结点的指针数组 cqcq1=T; / 根入队while(front!=rear) front=(front+1)%NodeNum; p=cqfront; / 出队 printf( / 出队,输出结点的值 if(p-lchild!=NULL) rear=(rear+1)%NodeNum;cqrear=p-lchild; / 左子树入队if(p-rchild!rchild; / 右子树入队/= 主函数 =void main()

10、BinTree root;int i,depth;Creat Bin_Tree ; Input preorder: / 输入完全二叉树/ 用 # 代 表 虚 结 点 , 如root=CreatBinTree();/ 创建二叉树,返回根结点do / 从菜单中选择遍历方式,输入序号。ABD#CE#F#tselectt1: Preorder Traversalnt2: Iorder Traversalnt3: Postorder traversalnt4: PostTreeDepth,Node number,Leaf numbernt5: Level Depthn / 按层次遍历之前,先选择 4,求

11、出该树的结点数。t0: Exitnt scanf(i); / 输入菜单序号( 0-5 )switch (i)case 1:Print Bin_tree Preorder: Preorder(root); / 先序遍历break;case 2:Print Bin_Tree Inorder:Inorder(root); / 中序遍历case 3:Print Bin_Tree Postorder:Postorder(root); / 后序遍历case 4: depth=TreeDepth(root); / 求树的深度及 叶子数BinTree Depth=%d BinTree Node number=

12、%d,depth,NodeNum); BinTree Leaf number=%d,leaf);case 5:LevePrint Bin_Tree:Levelorder(root); / 按层次遍历default: exit(1); while(i!=0);执行程序1.先序遍历2.中序遍历3.后序遍历4.结点数 叶子数 高度5. 层次遍历自己设计的:abdhl#m#i#e#jn#cf#ko#g#1.预计先序遍历结果: abdhlmiejncfkog2.预计中序遍历结果: lhmdibenjafokcg3.预计后序遍历结果: lmhidnjebokfgca4.结点数 15 高度 5 叶子数 6实

13、际结果:实验心得 :这次实验主要是要让我们熟练树及其相关知识 熟练掌握 先序中序后序遍历, 层次遍历 然后我们自己画一个图 会实现以上功 能 以及叶子数 结点数还有高度的计算 程序里面大量运用了递归以 及队的应用,实验三、图的遍历操作一、 目的掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图 的存储结构;掌握 DFS 及 BFS 对图的遍历操作;了解图结构在人 工智能、工程等领域的广泛应用。采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无 向图的 DFS 和 BFS 操作。三、 DFS 和 BFS 的基本思想深度优先搜索法 DFS 的基本思想:从图 G 中某个顶点 Vo 出发, 首

14、先访问 Vo ,然后选择一个与 Vo 相邻且没被访问过的顶点 Vi 访 问,再从 Vi 出发选择一个与 Vi 相邻且没被访问过的顶点 Vj 访 问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已 被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的 相邻顶点的顶点 W,从 W 出发按同样方法向前遍历。直到图中所 有的顶点都被访问。广度优先算法 BFS 的基本思想:从图 G 中某个顶点 Vo 出发, 首先访问 Vo ,然后访问与 Vo 相邻的所有未被访问过的顶点 V1 , V2 , Vt ;再依次访问与 V1 ,V2 , Vt 相邻的起且未被 访问过的的所有顶点。如此继续,直到访问完图

15、中的所有顶点。四、 程序源代码1 邻接矩阵作为存储结构的程序示例 #include #includestdlib.h#define MaxVertexNum 100 / 定义最大顶点数typedef structchar vexsMaxVertexNum; / 顶点表int edgesMaxVertexNumMaxVertexNum; / 邻接矩 阵,可看作边表int n,e; / 图中的顶点数 n 和边数 eMGraph; / 用邻接矩阵表示的图的类型/= 建立邻接矩阵 = void CreatMGraph(MGraph *G)int i,j,k;char a;Input VertexNum

16、(n) and EdgesNum(e):%d,%dG-n,&e); / 输入顶点数和 边数a);Input Vertex string:for(i=0;in;i+)vexsi=a; / 读入顶点信息,建立顶点表for(j=0;jj+)edgesij=0; / 初始化邻接矩阵Input edges,Creat Adjacency Matrixnfor(k=0;kvexsi);visitedi=TRUE;if(G-edgesij=1 & ! visitedj)DFSM(G,j);问过,故 Vj 为新出发点void DFS(MGraph *G)int i;/ 标志向量初始化visitedi=FALS

17、E;DFSM(G,i);/ 以 Vi 为源点开始 DFS 搜索int i,j,f=0,r=0;int cqMaxVertexNum; for(i=0;i+) visitedi=FALSE;cqi=-1;vexsk); visitedk=TRUE;cqr=k; /Vk 将其序号入队while(cqf!=-1) i=cqf; f=f+1;/=BFS :广度优先遍历 =void BFS(MGraph *G,int k) / 以 Vk 为源点对用邻接矩阵表示的图 G 进行广 度优先搜索/ 定义队列/ 队列初始化/ 访问源点 Vk已访问,将其入队。注意,实际上是/ 队非空则执行/Vf 出队/ 依次 Vi

18、 的邻接点 Vjvisitedj) /Vj 未访问vexsj); / 访问 Vj visitedj=TRUE;r=r+1; cqr=j;/ 访问过 Vj 入队/=main=MGraph *G;G=(MGraph *)malloc(sizeof(MGraph); / 为图 G 申请内 存空间CreatMGraph(G); / 建立邻接矩阵 printf(Print Graph DFS:DFS(G); / 深度优先遍历 printf(Print Graph BFS:BFS(G,3); / 以序号为 3 的顶点开始广度优先遍 历调试结果:自己画的图:1 对应顶点下标 0 以此类推 9 对应下标 8

19、预计运行结果:DFS:012345678BFS:324105687对应我这个图:DFS :123456789BFS :435216798图在数据结构中是相当重要的一部分 联系很多现实问题 图的根本就是顶点和边 通过顶点和边建立邻接矩阵以及邻接链表 广度搜索和深度搜索是此算法着重关注的地方。要学会自己画图 然 后写出这两种搜索的结果, 程序中用了队的算法 是亮点 通过 TRUE 和 FAUSE 来标记顶点是否以及访问 避免重复实验四、排序掌握各种排序方法的基本思想、排序过程、算法实现,能进行时 间和空间性能的分析, 根据实际问题的特点和要求选择合适的排序方 法。实现直接排序、冒泡、直接选择、快速

20、、堆、归并排序算法。比 较各种算法的运行速度。三、 程序示例#define Max 100 / 假设文件长度typedef struct / 定义记录类型int key; / 关键字项RecType;typedef RecType SeqListMax+1; /SeqList为顺序表,表中第 0个元素作为哨兵int n; / 顺序表实际的长度1 、 直接插入排序的基本思想: 每次将一个待排序的记录, 按其关 键字大小插入到前面已排序好的子文件中的适当位置,直到全部 记录插入完成为止。/= 直接插入排序法 =void InsertSort(SeqList R) / 对顺序表 R 中的记录 R1 n 按递增序进行插入排序int i,j;if(Ri.keyRi-1.key) / 若 Ri.key 大于等于有序区中所有 的 keys ,则 Ri 留在原位R0=Ri;j=i-1; /R0 是 Ri 的副本do / 从右向左在有序区 R1 i-1 中查找 Ri 的位置Rj+1=Rj; / 将关键字大于 Ri.key 的记录后移 j-;while(R0.keyRj.key); / 当 R

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

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