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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

1、单链表的插入和删除实验报告实验一、单链表的插入和删除一、目的了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。二、要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。三、程序源代码includestdio.hinclude”string.hincludestdlib。h”#include”ctype。htypedef struct node /定义结点 char data10; /结点的数据域为字符串 struct node next; /结点的指针域 ListNode;typedef List

2、Node LinkList; / 自定义LinkList单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表ListNode LocateNode(); /函数,按值查找结点void DeleteList(); /函数,删除指定值的结点void printlist(); /函数,打印链表中的所有值void DeleteAll(); /函数,删除所有结点,释放内存/=主函数=void main() char ch10,num10; LinkList head; head=CreatListR1(); /用尾插入法建立单链表,返回头指针 printlis

3、t(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); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表= LinkList CreatListR1(void) ch

4、ar 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) /没有重复的字符串,插入到链表中 s=(Li

5、stNode *)malloc(sizeof(ListNode); strcpy(sdata,ch); rnext=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; /从开始结点比较 while(p&strcmp(p-data,

6、key)!=0 ) /直到p为NULL或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); while(qnext!=p) /p为要删除的结点,q为p的前结点 q

7、=qnext; r=q-next; qnext=rnext; free(r); /释放结点/=打印链表=void printlist(LinkList head) ListNode *p=headnext; /从开始结点打印 while(p) printf(s, ,pdata); p=pnext; printf(”n”);/=删除所有结点,释放空间=void DeleteAll(LinkList head) ListNode *p=head,*r; while(p-next) r=p-next; free(p); p=r; free(p);运行结果:加的添加结点的代码:int Insert(L

8、istNode head) / the insert function ListNode *in,*p,*q; int wh; printf(input the insert node:); in=(ListNode )malloc(sizeof(ListNode));in-next=NULL; p=(ListNode *)malloc(sizeof(ListNode);pnext=NULL; q=(ListNode )malloc(sizeof(ListNode);qnext=NULL; if(!in) return 0; scanf(”s”,indata); printf(input th

9、e place where you want to insert you data:”); scanf(”d,&wh); for(p=head;wh0;p=pnext,wh-); q=pnext; pnext=in; in-next=q; return 1;运行结果:最后提示为OK 添加成功。实验心得:这个实验中 主要修改的是ch 和 num 把它们由指针改成数组 因为不改的话在后面delect函数中会出现没有地址的情况 找不到地址就不能执行功能 然后把locate函数的判断语句改一下 避免矛盾的出现。实验二、二叉树操作一、目的掌握二叉树的定义、性质及存储方式,各种遍历算法。二、要求采用二叉树

10、链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。三、程序源代码#include”stdio。h#includestring。h#define Max 20 /结点的最大个数typedef struct node char 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(); /构造左子树 Trchild=CreatBinTree(); /构造右子树 return(T); /=NLR 先序遍历=void Preorder(BinTree T) if(T) printf(”c,T-data);

12、/访问结点 Preorder(T-lchild); /先序遍历左子树 Preorder(T-rchild); /先序遍历右子树 /=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(Tlchild); /后序遍历左子树 Postorder(Trchild); /后序遍历右子树 printf(”%c”

13、,T-data); /访问结点 /=采用后序遍历求二叉树的深度、结点数及叶子数的递归算法=int TreeDepth(BinTree T) int hl,hr,max; if(T) hl=TreeDepth(Tlchild); /求左深度 hr=TreeDepth(T-rchild); /求右深度 max=hlhr? hl:hr; /取左右深度的最大值 NodeNum=NodeNum+1; /求结点数 if(hl=0hr=0) leaf=leaf+1; /若左右深度为0,即为叶子。 return(max+1); else return(0);/=利用“先进先出”(FIFO)队列,按层次遍历二叉

14、树=void Levelorder(BinTree T) int front=0,rear=1; BinTNode cqMax,*p; /定义结点的指针数组cq cq1=T; /根入队 while(front!=rear) front=(front+1)%NodeNum; p=cqfront; /出队 printf(%c”,p-data); /出队,输出结点的值 if(p-lchild!=NULL) rear=(rear+1)NodeNum; cqrear=plchild; /左子树入队 if(prchild!=NULL) rear=(rear+1)%NodeNum; cqrear=p-rch

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

16、torder traversaln); printf(t4: PostTreeDepth,Node number,Leaf numbern”); printf(t5: Level Depthn); /按层次遍历之前,先选择4,求出该树的结点数。 printf(t0: Exitn); printf(t*n); scanf(”%d,&i); /输入菜单序号(05) switch (i) case 1: printf(Print Bin_tree Preorder: ); Preorder(root); /先序遍历 break; case 2: printf(”Print Bin_Tree Inor

17、der: ); Inorder(root); /中序遍历 break; case 3: printf(”Print Bin_Tree Postorder: ); Postorder(root); /后序遍历 break; case 4: depth=TreeDepth(root); /求树的深度及叶子数 printf(BinTree Depth=%d BinTree Node number=%d,depth,NodeNum); printf(” BinTree Leaf number=%d”,leaf); break; case 5: printf(LevePrint Bin_Tree: ”)

18、; Levelorder(root); /按层次遍历 break; default: exit(1); printf(”n”); while(i!=0); 执行程序1.先序遍历2.中序遍历3.后序遍历4.结点数 叶子数 高度5.层次遍历自己设计的:abdhlm#i#e#jn#cf#ko#g#1。预计先序遍历结果:abdhlmiejncfkog2。预计中序遍历结果:lhmdibenjafokcg3.预计后序遍历结果:lmhidnjebokfgca4.结点数 15 高度5 叶子数 6实际结果:实验心得:这次实验主要是要让我们熟练树及其相关知识 熟练掌握先序中序后序遍历,层次遍历 然后我们自己画一个

19、图 会实现以上功能 以及叶子数 结点数还有高度的计算 程序里面大量运用了递归以及队的应用, 实验三、图的遍历操作一、目的掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。二、要求采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。三、DFS和BFS 的基本思想深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,依次继续.如果当前被访问过的顶点的所有

20、邻接顶点都已被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W,从W出发按同样方法向前遍历.直到图中所有的顶点都被访问。 广度优先算法BFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,Vt;再依次访问与V1,V2,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。四、程序源代码1邻接矩阵作为存储结构的程序示例includestdio.hinclude”stdlib。h”define MaxVertexNum 100 /定义最大顶点数typedef struct char vexsMaxV

21、ertexNum; /顶点表 int edgesMaxVertexNumMaxVertexNum; /邻接矩阵,可看作边表 int n,e; /图中的顶点数n和边数eMGraph; /用邻接矩阵表示的图的类型/=建立邻接矩阵=void CreatMGraph(MGraph *G) int i,j,k; char a; printf(”Input VertexNum(n) and EdgesNum(e): ”); scanf(d,d,G-n,Ge); /输入顶点数和边数 scanf(”c,&a); printf(Input Vertex string:”); for(i=0;in;i+) sca

22、nf(”c”,&a); Gvexsi=a; /读入顶点信息,建立顶点表 for(i=0;iG-n;i+) for(j=0;jn;j+) G-edgesij=0; /初始化邻接矩阵 printf(Input edges,Creat Adjacency Matrixn); for(k=0;kedgesij=1; G-edgesji=1; /若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(M

23、Graph *G,int i) /以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵 int j; printf(c,Gvexsi); /访问顶点Vi visitedi=TRUE; /置已访问标志 for(j=0;jGn;j+) /依次搜索Vi的邻接点 if(G-edgesij=1 & ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未访问过,故Vj为新出发点void DFS(MGraph G) int i; for(i=0;in;i+) visitedi=FALSE; /标志向量初始化 for(i=0;iGn;i+) cqi=1; /队列初始化 p

24、rintf(”c”,Gvexsk); /访问源点Vk visitedk=TRUE; cqr=k; /Vk已访问,将其入队.注意,实际上是将其序号入队 while(cqf!=-1) /队非空则执行 i=cqf; f=f+1; /Vf出队 for(j=0;jn;j+) /依次Vi的邻接点Vj if(G-edgesij=1 & !visitedj) /Vj未访问 printf(”%c,Gvexsj); /访问Vj visitedj=TRUE; r=r+1; cqr=j; /访问过Vj入队 /=main=void main() int i; MGraph G; G=(MGraph )malloc(si

25、zeof(MGraph)); /为图G申请内存空间 CreatMGraph(G); /建立邻接矩阵 printf(”Print Graph DFS: ); DFS(G); /深度优先遍历 printf(”n); printf(Print Graph BFS: ); BFS(G,3); /以序号为3的顶点开始广度优先遍历 printf(n);调试结果:自己画的图: 1对应顶点下标0 以此类推 9对应下标8预计运行结果:DFS:012345678BFS:324105687对应我这个图:DFS:123456789BFS:435216798实验心得:图在数据结构中是相当重要的一部分 联系很多现实问题

26、图的根本就是顶点和边 通过顶点和边建立邻接矩阵以及邻接链表 广度搜索和深度搜索是此算法着重关注的地方.要学会自己画图 然后写出这两种搜索的结果,程序中用了队的算法 是亮点 通过TRUE和FAUSE来标记顶点是否以及访问 避免重复 实验四、排序一、目的掌握各种排序方法的基本思想、排序过程、算法实现,能进行时间和空间性能的分析,根据实际问题的特点和要求选择合适的排序方法.二、要求实现直接排序、冒泡、直接选择、快速、堆、归并排序算法。比较各种算法的运行速度。三、程序示例includestdio.hinclude”stdlib。hdefine Max 100 /假设文件长度typedef struct /定义记录类型 int key; /

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

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