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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

单链表的插入和删除实验报告.docx

1、单链表的插入和删除实验报告实验一、单链表的插入和删除一、 目的了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基 本算法及相关的时间性能分析。二、 要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复 的字符串;根据输入的字符串,先找到相应的结点,后删除之。void DeleteList(); / 函数,删除指定值的结点void printlist(); / 函数,打印链表中的所有值void DeleteAll(); / 函数,删除所有结点,释放内存/=主函数= void main()(char ch10,num10;LinkList head;head=CreatListR1

2、(); / 用尾插入法建立单链表,返回头指针printlist(head); / 遍历链表输出其值printf( Delete node (y/n):);/ 输入 “y” 或 “ n” 去选择是否删除结点scanf(%s,num);if(strcmp(num,y)=0 | strcmp(num,Y)=0)printf(Please input Delete_data:);scanf(%s”,ch); / 输入要删除的字符串DeleteList(head,ch);printlist(head);DeleteAll(head); / 删除所有结点,释放内存/=用尾插入法建立带头结点的单链表 =Li

3、nkList CreatListRI(void) (char ch10;LinkList head=(LinkList)malloc(sizeof(ListNode); / 生成头结点ListNode *s,*r,*pp;r=head;r-next=NULL;printf(Input # to end ); / 输入 “#” 代表输入结束printf(Please input Node_data:);scanf(%s”,ch); / 输入各结点的字符串while(strcmp(ch,#)!=0) (pp=LocateNode(head,ch); /按值查找结点,返回结点指针if(pp=NULL

4、) ( / 没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode);strcpy(s-data,ch);r-next=s;r=s;r-next=NULL;printf(Input # to end );printf(Please input Node_data:);scanf(%s,ch);return head; / 返回头指针/=按值查找结点,找到则返回该结点的位置,否则返回NULL=ListNode *LocateNode(LinkList head, char *key)(ListNode *p=head-next; / 从开始结点比较

5、while(p&strcmp(p-data,key)!=0 ) / 直到 p 为 NUL或 p-data 为 key 止p=p-next; / 扫描下一个结点return p; / 若p=NULL则查找失败,否则 p指向找到的值key的结点/=删除带头结点的单链表中的指定结点 =void DeleteList(LinkList head,char *key)(ListNode *p,*r,*q=head;p=LocateNode(head,key); / 按 key 值查找结点的if(p=NULL ) ( / 若没有找到结点,退出printf(position error);exit(0);w

6、hile(q-next!=p) /p 为要删除的结点,q为p的前结点q=q-next;r=q-next;q-next=r-next;free(r); / 释放结点/=打印链表= void printlist(LinkList head)(ListNode *p=head-next; / 从开始结点打印while(p)(printf(%s, ,p-data);p=p-next;printf(n);/=删除所有结点,释放空间=void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)(r=p-next;free(p);p=r;fre

7、e(p);运行结果:加的添加结点的代码:int Insert(ListNode *head) / the insert function(ListNode *in,*p,*q;int wh;in=(ListNode *)malloc(sizeof(ListNode);in-next=NULL;p=(ListNode *)malloc(sizeof(ListNode);p-next=NULL;q=(ListNode *)malloc(sizeof(ListNode);q-next=NULL;if(!in)return 0;scanf(%s”,in-data);printf(input the p

8、lace where you want to insert you data:);scanf(%d”,&wh);for(p=head;wh0;p=p-next,wh-);q=p-next;p-next=in;in-next=q;return 1;运行结果:Input InputI nput InputI nput dh.tt tt tt tt chaend end end end endPleasePleasePleasePleasePleaseinput input input input inputeefcr hfaej.Delete node (y/n):n insert ornot?i

9、nputinputthetheNode_data:dh Node_data:cha Node_data:eeFc Node_data:hfae Node_data:ttinsert node:CAdeplace uhere you uant to insert you data:2key to continue最后提不为OK添加成功实验心得:这个实验中 主要修改的是ch和num把它们由指针改成数组 因为不改的话在后面delect函数中会出现没有地址的情况 找不 到地址就不能执行功能 然后把locate函数的判断语句改一下 避免矛 盾的出现。实验二、二叉树操作一、 目的掌握二叉树的定义、性质及存

10、储方式,各种遍历算法。二、 要求采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。三、 程序源代码#includestdio.h”#includestring.h”#define Max 20 / 结点的最大个数typedef struct nodechar data;struct node *lchild,*rchild;BinTNode; / 白定义二叉树的结点类型typedef BinTNode *BinTree; / 定义二叉树的指针int NodeNum,leaf; /NodeNum 为结点数,leaf 为叶子数/=基于先

11、序遍历算法创建二叉树 =/=要求输入先序序列,其中加入虚结点“ #”以示空指针的位置BinTree CreatBinTree(void)(BinTree T;char ch;if(ch=getchar()=#)return(NULL); / 读入#,返回空指针else(T=(BinTNode *)malloc(sizeof(BinTNode); / 生成结点T-data=ch;T-lchild=CreatBinTree();T-rchild=CreatBinTree();return(T);/=NLR 先序遍历=void Preorder(BinTree T)(if(T) (printf(%c

12、,T-data); / 构造左子树/ 构造右子树访问结点先序遍历左子树Preorder(T-lchild); /=LNR 中序遍历=void Inorder(BinTree T)(/ 中序遍历左子树/ 访问结点/ 中序遍历右子树if(T) (Inorder(T-lchild);printf(%c,T-data);Inorder(T-rchild);/=LRN 后序遍历=void Postorder(BinTree T) (if(T) (后序遍历左子树后序遍历右子树Postorder(T-lchild); /Postorder(T-rchild); /printf(%c,T-data); / 访

13、问结点/=采用后序遍历求二叉树的深度、结点数及叶子数的递归算法int TreeDepth(BinTree T)int hl,hr,max;return(max+1);else return(0);void Levelorder(BinTree T)int front=0,rear=1;while(front!=rear)front=(front+1)%NodeNum;if(p-lchild!=NULL)(rear=(rear+1)%NodeNum;cqrear=p-lchild; / 左子树入队if(p-rchild!=NULL)(rear=(rear+1)%NodeNum;cqrear=p-

14、rchild; / 右子树入队/=主函数=void main()(BinTree root;int i,depth;printf(n);printf(Creat Bin_Tree ; Input preorder:); / 输入完全二义树的先序序列,/ 用#代表虚结点,如ABD#CE#F#root=CreatBinTree(); / 创建二叉树,返回根结点从菜单中选择遍历方式,输入序号。printf(t* select *n);printf(t1: Preorder Traversaln);printf(t2: Iorder Traversaln);printf(t3: Postorder t

15、raversaln);numbern);4,求出该树的结点数。printf(t0: Exitn);printf(t*n);switch (i)case 1: printf(Print Bin_tree Preorder:);break;case 2: printf(Print Bin_Tree Inorder:);break;case 3: printf(Print Bin_Tree Postorder:);break;求树的深度及叶case 4: depth=TreeDepth(root); /子数number=%d,depth,NodeNum);printf( BinTree Leaf n

16、umber=%d,leaf); break;case 5: printf(LevePrint Bin_Tree:);Levelorder(root); / 按层次遍历break; default: exit(1);printf(n); while(i!=0);执行程序1.先序遍历1Prin t Hin_tree Pieordei*: abdhlnie Jncf hog2.中序遍历Print Bin_Trec Inander * Ihnd ibcnjafokcg3.后序遍历Print BinTree Postorder: Inhidnjebokfca4.结点数叶子数高度ihlKt Dtpth :

17、5 Binlirte Nocle BinTfte Leaf 的瞄州5.层次遍历LeuePi*int Bin_Tree :己bcdef ghi jklmno自己设计的:abdhl#m#i#e#jn#cf#ko#g#1. 预计先序遍历结果: abdhlmiejncfkog2. 预计中序遍历结果:lhmdibenjafokcg3. 预计后序遍历结果:lmhidnjebokfgca4结点数15高度5叶子数6实际结果:Creat Bin_Tree;Input pveordei* = Jntt4l4tcfXKXXXXXXJt* select hhxxnnjcjcxhhh 1: Preoi*(lep Tpa

18、uep-sa.! 2 = lorder Iraucrsal 3: PoEtor-der traueisal 4 : PosCT pee Depths No de nunbei*- Le.f numhei 5: Leuel Depth S: Exit1 Print Bin_tree Preorder-: abtihlnxeJncfkog* 2 Print Binjree Inorder: Ihmdibcnjafokcg- 3 Print Bin_Tree Postupdee: ImhidnJebokfgca 4 BinTree Deptli=5 BinTr-ee Node mirnbe 1=15

19、 BinTree Leaf nuiriber-fi 5 LevePr int Blnjree : ahcdef sfhijklmno 0 Press anv key to continue-实验心得:这次实验主要是要让我们熟练树及其相关知识 熟练掌握先序中序后序遍历,层次遍历 然后我们白己画一个图 会实现以上功 能 以及叶子数 结点数还有高度的计算 程序里面大量运用了递归以 及队的应用,实验三、图的遍历操作一、 目的掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图 的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人 工智能、工程等领域的广泛应用。二、 要求采用邻接矩阵和邻接链表

20、作为图的存储结构,完成有向图和无 向图的DFS和BFS操作。三、 DFS和BFS的基本思想深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发, 首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问, 再从Vi出发选择一个与Vi相邻且没被访问过的顶点 Vj访问, 依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问, 则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶 点的顶点W,从W出发按同样方法向前遍历。直到图中所有的顶 点都被访问。广度优先算法BFS的基本思想:从图G中某个顶点Vo出发, 首先访问Vo,然后访问与 Vo相邻的所有未被访问过的顶点 V1 , V2,,

21、Vt;再依次访问与 V1 , V2,,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。四、程序源代码1. 邻接矩阵作为存储结构的程序示例#includestdio.h”#includestdlib.h”#define MaxVertexNum 100 / 定义最大顶点数typedef structchar vexsMaxVertexNum; / 顶点表int edgesMaxVertexNumMaxVertexNum; / 邻接矩阵,可看作边表int n,e; / 图中的顶点数n和边数eMGraph; / 用邻接矩阵表示的图的类型/=建立邻接矩阵=void Creat

22、MGraph(MGraph *G)int i,j,k;char a;printf(Input VertexNum(n) and EdgesNum(e):);scanf(%d,%d,&G-n,&G-e); / 输入顶点数和边数scanf(%c”,&a);printf(Input Vertex string:);for(i=0;in;i+)scanf(%c”,&a);G-vexsi=a; / 读入顶点信息,建立顶点表for(i=0;in;i+)for(j=0;jn;j+)G-edgesij=0; / 初始化邻接矩阵printf(Input edges,Creat Adjacency Matrixn

23、);for(k=0;ke;k+) ( / 读入e条边,建立邻接矩阵scanf(%d%d,&i,&j); / 输入边(Vi , Vj)的顶点序号G-edgesij=1;G-edgesji=1; /若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句/=定义标志向量,为全局变量 =typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(MGraph *G,int i) /以Vi为出发点对邻接矩阵表示的图 G进行DFS搜索,邻接矩阵是0,1矩阵int j;printf(%c,G-v

24、exsi); /visitedi=TRUE; /for(j=0;jn;j+) /if(G-edgesij=1 & ! visitedj)DFSM(G,j); /过,故Vj为新出发点void DFS(MGraph *G)int i;for(i=0;in;i+)visitedi=FALSE; /for(i=0;in;i+)if(!visitedi) /ViDFSM(G,i); /=BFS广度优先遍历=void BFS(MGraph *G,int k)访问顶点Vi置已访问标志依次搜索Vi的邻接点(Vi , Vj) C E,且Vj未访问标志向量初始化未访问过以Vi为源点开始DFS搜索 / 以Vk为源点

25、对用邻接矩阵表示的图G进行广度优先搜索int i,j,f=0,r=0;int cqMaxVertexNum; /for(i=0;in;i+)visitedi=FALSE; /for(i=0;in;i+)cqi=-1; /printf(%c,G-vexsk); / visitedk=TRUE;cqr=k; /Vk将其序号入队while(cqf!=-1) ( /i=cqf; f=f+1; /Vffor(j=0;jn;j+) /定义队列标志向量初始化队列初始化访问源点Vk已访问,将其入队。注意,实际上是队非空则执行出队依次Vi的邻接点Vjif(G-edgesij=1 & !visitedj) ( /

26、Vj访问printf(%c,G-vexsj); / 访问 Vjvisitedj=TRUE; r=r+1; cqr=j; / 访问过 Vj 入队 /=main= void main()int i;MGraph *G;G=(MGraph *)malloc(sizeof(MGraph); / 为图 G申请内存空间CreatMGraph(G); /printf(Print Graph DFS:);DFS(G); /printf(n);printf(Print Graph BFS: );BFS(G,3); /历建立邻接矩阵深度优先遍历以序号为3的顶点开始广度优先遍printf(n);调试结果:白己画的图

27、:1对应顶点下标0以此类推9对应下标8预计运行结果:DFS:012345678BFS:324105687对应我这个图:DFS: 123456789BFS: 435216798实验心得:图在数据结构中是相当重要的一部分 联系很多现实问题图的根本就是顶点和边 通过顶点和边建立邻接矩阵以及邻接链表 广度搜索和深度搜索是此算法着重关注的地方。要学会白己画图 然后写出这两种搜索的结果,程序中用了队的算法 是亮点 通过TRUE 和FAUSE来标记顶点是否以及访问避免重复实验四、排序一、 目的掌握各种排序方法的基本思想、排序过程、算法实现,能进行时间和空间性能的分析,根据实际问题的特点和要求选择合适的排序方 法。二、 要求实现直接排序、冒泡、直接选择、快速、堆、归并排序算法。比较各种算法的运行速度。三、 程序示例#includestdio.h”#includestdlib.h”#define Max 100 / 假设文件长度typedef struct / 定义记录类型int key; / 关键字项RecTy

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

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