算法与数据结构图的应用实验报告
数据结构与算法分析实验报告
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构与算法 图的结构和操作实验报告
《数据结构与算法分析》课程实验报告【实验目的】1. 理解图形结构的逻辑和存储特点。
2. 掌握图形结构遍历递归算法。
【实验内容】1. 用邻接矩阵或者邻接表存储一个图形结构。
2. 采用深度或者广度优先搜索算法,遍历一个图,并输出遍历结果。
【实验方式】个人实验。
【实验设备与环境】PC机,Windows XP操作系统,VC++6.0开发环境。
【数据结构及函数定义】(1)类的定义:类的数据成员,成员函数...................(2)主函数main()实现初始化操作,完成对子函数的调用...................(3)子函数...................。
【测试数据与实验结果】(请用截图的方式展示实验结果,并辅以必要的文字说明)【源程序清单】(请附上源程序)#include<iostream>using namespace std;#include<string.h>class Graph{public:c har Vtx[20];d ouble AdjMtx[20][20];i nt CurrentVnum;i nt CurrentEnum;G raph(){CurrentVnum=CurrentEnum=0;} i nt first_adj(int v);i nt next_adj(int v1,int v2);v oid visite(int v);v oid DFS();v oid DFS(int v,int visited[]);~Graph(){}};int Graph::first_adj(int v){f or(int v1=0;v1<CurrentVnum;v1++)if(AdjMtx[v][v1]>0)return v1;return -1;}int Graph::next_adj(int v1,int v2) {f or(int vn=v2+1;vn<CurrentVnum;vn++)if(AdjMtx[v1][vn]>0)return vn;return -1;}void Graph::visite(int v){c out<<Vtx[v]<<" ";}void Graph::DFS(){i nt *visited=new int[CurrentVnum];f or(int i=0;i<CurrentVnum;i++)visited[i]=0;f or(i=0;i<CurrentVnum;i++){if(visited[i]==0)DFS(i,visited);}d elete[] visited;}void Graph::DFS(int v,int visited[]) {v isite(v);v isited[v]=1;i nt w=first_adj(v);w hile(w!=-1){if(!visited[w])DFS(w,visited);w=next_adj(v,w);}}int LocateVex(Graph G,char u){i nt i;f or(i=0;i<G.CurrentVnum;i++)if(u==G.Vtx[i])return i;return -1;}void creat(Graph &G){i nt i,j,k;c har va,vb;c out<<"请输入图的顶点数,弧数:";c in>>G.CurrentVnum>>G.CurrentEnum;c out<<"请输入"<<G.CurrentVnum<<"个顶点的值:";f or(i=0;i<G.CurrentVnum;i++)cin>>G.Vtx[i];f or(i=0;i<G.CurrentVnum;i++)for(j=0;j<G.CurrentVnum;j++)G.AdjMtx[i][j]=0;c out<<"请输入"<<G.CurrentEnum<<"条弧的弧尾,弧头(以空格作为间隔):\n";f or(k=0;k<G.CurrentEnum;k++){cin>>va>>vb;i=LocateVex(G,va);j=LocateVex(G,vb);if(i!=j){G.AdjMtx[i][j]=1;G.AdjMtx[j][i]=1;}else G.AdjMtx[i][j]=1;}}void main(){G raph G;c reat(G);c out<<"深度优先搜索序列:"<<endl;G.DFS();c out<<endl;。
数据结构图的实验报告
数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。
它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。
本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。
具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。
无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。
然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。
这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。
例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。
2. 数据操作在构建好数据结构图后,我们可以进行多种操作。
例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。
我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。
3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。
它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。
同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。
四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。
我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。
数据结构与算法实验报告
数据结构与算法实验报告数据结构与算法实验报告一、引言1.1 背景介绍:介绍数据结构与算法在现代科技领域中的重要性和应用。
1.2 实验目的:明确本实验的目标和需要解决的问题。
1.3 实验内容:详细描述本次实验所使用的数据结构和算法。
1.4 实验方法:阐述实验过程中所采用的步骤和方法。
1.5 实验环境:列出本次实验所使用的硬件和软件环境要求。
二、需求分析2.1 功能需求:详细描述实验所要求实现的功能和效果。
2.2 性能需求:阐述实验对资源利用率和运行效率的要求。
2.3 输入输出需求:明确实验所需输入和期望输出的格式和要求。
三、设计与实现3.1 数据结构设计:给出实验所需的数据结构定义和描述。
3.1.1 数据结构一:介绍数据结构一的定义和特点。
3.1.2 数据结构二:介绍数据结构二的定义和特点。
3.2 算法设计:描述实验所需的算法思路和流程。
3.2.1 算法一:阐述算法一的实现原理和步骤。
3.2.2 算法二:阐述算法二的实现原理和步骤。
3.3 实现过程:详细描述根据设计完成的实现过程。
3.3.1 步骤一:列出实现过程中的第一步骤。
3.3.2 步骤二:列出实现过程中的第二步骤。
3.4 算法优化:对实现过程中的算法进行优化和改进。
3.4.1 优化一:介绍所进行的优化操作和效果。
3.4.2 优化二:介绍所进行的优化操作和效果。
四、实验结果与分析4.1 实验数据:给出实验过程中所使用的测试数据。
4.2 实验结果:列出实验运行的结果和输出。
4.3 结果分析:对实验结果进行详细分析和解释。
五、实验总结5.1 实验心得:总结实验过程中所学到的知识和经验。
5.2 实验收获:列出实验中获得的成果和收获。
六、附件本文档涉及的附件包括但不限于:源代码、输入输出样例、实验数据等。
七、注释本文档中涉及的法律名词及其注释如下:- 法律名词一:注释一。
- 法律名词二:注释二。
数据结构与算法实验报告[1]
数据结构与算法实验报告实验目的:本次实验主要目的是掌握数据结构与算法的基本概念和实际应用。
通过设计和实现特定的数据结构和算法,加深对其原理和应用的理解,培养分析和解决实际问题的能力。
实验内容:本次实验包括以下几个部分:1\实验环境和工具介绍在本部分,将介绍实验所使用的开发环境和工具,包括操作系统、编程语言、集成开发环境等。
2\实验设计和思路本部分将详细介绍实验的设计思路、算法的选择和实现方式。
具体包括数据结构的选择、算法的设计原理、时间和空间复杂度分析等。
3\实验步骤和代码实现在本部分,将详细列出实验的具体步骤和算法的实现代码。
包括数据结构的定义和操作、算法的实现和测试数据的等。
4\实验结果和分析在本部分,将展示实验的运行结果,并对实验结果进行分析和讨论。
包括实际运行时间、空间占用、算法的优缺点等方面的讨论。
5\实验总结和思考在本部分,将对整个实验进行总结和思考。
包括实验过程中遇到的问题和解决方法,对实验结果的评价,以及对进一步的研究方向的思考等内容。
附件:本文档附带以下附件:1\源代码:包括数据结构的定义和操作,算法的实现等。
2\测试数据:用于验证算法实现的测试数据。
3\实验结果截图:包括算法运行结果、时间和空间占用等方面的截图。
法律名词及注释:1\数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2\算法:算法是解决问题的一系列清晰而简明的指令,是计算或操作的一种良定义的规程。
3\时间复杂度:时间复杂度是度量算法运行时间长短的一个表达式,用大O符号表示。
4\空间复杂度:空间复杂度是度量算法运行过程中所需的存储空间的一个表达式,用大O符号表示。
结语:本文档详细介绍了数据结构与算法实验的设计思路、步骤和实现代码,并对实验结果进行了分析和讨论。
实验过程中,我们掌握了数据结构与算法的基本概念和实际应用,提高了问题解决能力和编程实践能力。
算法与数据结构实验报告
2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
算法与及数据结构实验报告
第一学期实验报告课程名称:算法与数据结构实验名称:城市链表一、实验目的本次实验的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。
同时,通过本次实验帮助学生复习高级语言的使用方法。
二、实验内容(一)城市链表:将若干城市的信息,存入一个带头结点的单链表。
结点中的城市信息包括:城市名,城市的位置坐标。
要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
(二) 约瑟夫环m 的初值为20;密码:3,1,7,2,6,8,4(正确的结果应为6,1,4,7,2,3,5)。
三、实验环境VS2010 、win8.1四、实验结果(一)城市链表:(1)创建城市链表;(2)给定一个城市名,返回其位置坐标;(3)给定一个位置坐标P 和一个距离D,返回所有与P 的距离小于等于D 的城市。
(4)在已有的城市链表中插入一个新的城市;(5)更新城市信息;(6)删除某个城市信息。
(二) 约瑟夫环m 的初值为20;密码:3,1,7,2,6,8,4输出6,1,4,7,2,3,5。
五、附录城市链表:5.1 问题分析该实验要求对链表实现创建,遍历,插入,删除,查询等操作,故使用单链表。
5.2 设计方案该程序大致分为以下几个模块:1.创建城市链表模块,即在空链表中插入新元素。
故创建城市链表中包涵插入模块。
2.返回位置坐标模块。
3.计算距离模块4.插入模块。
5.更新城市信息模块6.删除信息模块。
5.3 算法5.3.1 根据中心城市坐标,返回在距离内的所有城市:void FindCityDistance(citylist *L){//根据距离输出城市……//输入信息与距离L=L->next;while(L != NULL){if(((L->x-x1)*(L->x-x1)+(L->y-y1)*(L->y-y1)<=dis *dis)&&(((L->x-x1)+(L->y-y1))!=0 )){printf("城市名称%s\n",L->Name);printf("城市坐标%.2lf,%.2lf\n",L->x,L->y);}L=L->next;}}该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用横坐标差的平方+纵坐标差的平方<= 距离的平方判定。
算法与及数据结构实验报告
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
数据结构实验报告图的应用
实验题目:图的应用一、实验目的和任务1 掌握图的邻接表和邻接矩阵存储;2 掌握图的拓扑排序算法;二、实验内容及原理1以下两项内容选做一项。
2 请按照书中介绍的拓扑排序算法,完成P303页第5题。
3 给定某一个图,完成其深度优先搜索遍历和广度优先搜索遍历,每种遍历都必须在邻接矩阵和邻接表中完成。
四、实验数据及程序代码#include <iostream.h>#include <stdlib.h>#include <strstrea.h>#include <string.h>#include <stdio.h>const int MaxVertexNum=10;typedef int WeightType;struct edgenode{int adjvex;WeightType weight;edgenode*next;};typedef edgenode *adjlist[MaxVertexNum];void InitAdjoin(adjlist GL)//初始化{for(int i=0;i<MaxVertexNum;i++)GL[i]=NULL;}void CreatAdjoin(adjlist GL,int n,char*s,int k1,int k2)//生成邻接表{istrstream sin(s);char c1,c2,c3;WeightType w;edgenode*p;sin>>c1;if(k2==0){do{sin>>c1>>i>>c2>>j>>c3;p=new edgenode;p->adjvex=j;p->weight=1;p->next=GL[i];GL[i]=p;if(k1==0){p=new edgenode;p->adjvex=i;p->weight=1;p->next=GL[j];GL[j]=p;}sin>>c1;}while(c1==',');}else{do{sin>>c1>>i>>c2>>j>>c3>>w;p=new edgenode;p->adjvex=j;p->weight=w;p->next=GL[i];GL[i]=p;if(k1==0){p=new edgenode;p->adjvex=i;p->weight=w;p->next=GL[j];GL[j]=p;}sin>>c1;}while(c1==',');}}void PrintAdjion(adjlist GL, int n,int k1, int k2) {edgenode*p;cout<<"V={";for(i=0; i<n-1; i++) cout<<i<<',';cout<<n-1<<'}'<<endl;cout<<"E={";for(i=0;i<n;i++){if(k2==0){p=GL[i];while(p){j=p->adjvex;if(k1==0){if(i<j) cout<<'('<<i<<','<<j<<')'<<',';}elsecout<<'<'<<i<<","<<j<<'>'<<',';p=p->next;}}else{p=GL[i];while(p){j=p->adjvex;if(k1==0){if(i<j) cout<<'('<<i<<','<<j<<')'<<p->weight<<',';}elsecout<<'<'<<i<<','<<j<<'>'<<p->weight<<',';p=p->next;}}}cout<<'}'<<endl;}void Toposort(adjlist GL , int n){int i,j,k,top,m=0;edgenode*p;int*d=new int[n];for(i=0;i<n;i++) d[i]=0;for(i=0;i<n;i++){p=GL[i];while(p!=NULL){j=p->adjvex;d[i]++;p=p->next;//cout<<j;}}top=-1;for(i=0;i<n;i++)if(d[i]==0){d[i]=top; top=i;}while(top!=-1){j=top;top=d[top];cout<<j<<' ';m++;p=GL[j];while(p!=NULL){k=p->adjvex;d[k]--;if(d[k]==0){d[k]=top;top=k;}p=p->next;}}cout<<endl;cout<<top<<endl;cout<<m<<endl;cout<<n<<endl;if(m<n) cout<<"The network has a cycle!"<<endl;delete []d;}void main(){int n,k1,k2;cout<<"输入待处理图的顶点数:";cin>>n;cout<<"输入图的有无向和有无权选择(0为无,非0为有):";cin>>k1>>k2;adjlist gl;InitAdjoin(gl);cout<<"输入图的边集:";FILE *p;p=fopen("d:\\1.txt","r+");char *a=new char[100];while (!feof(p)){fscanf(p,"%s ",a);cout<<a;}cout<<endl;//cin>>a;CreatAdjoin(gl,n,a,k1,k2);Toposort(gl,n);}五、实验数据分析及处理六、实验结论与感悟(或讨论)图的邻接矩阵,邻接表和边集数组表示各有利弊,具体运用时,要根据图的稠密和稀疏程度以及算法的要求进行选择。
数据结构图实验报告
数据结构图实验报告数据结构图实验报告1. 引言数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。
图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网络分析等。
本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜索和最短路径算法等。
3. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
数据结构实验报告—图
《算法与数据结构》课程实验报告一、实验目的1.实现图的存储结构;2.通过图的相关算法实现,掌握其算法思想。
二、实验内容及要求1.无向带权图的存储结构(邻接矩阵、邻接表等自选)2.实现图的相关算法(1)计算指定顶点的度(2)图的深度优先遍历和广度优先遍历算法(3)分别使用Kruskal和Prim算法求解该图的最小生成树三、系统分析(1)数据方面:定义图的模板基类,在模板类定义中的数据类型参数表<class T,class E>中,T是定点数据的类型,E是边上所附数据的类型。
这个模板基类是按照带权无向图来定义的。
在该实验中定点的数据的类型为char型,边上所附数据的类型为int型。
且图的创建为无向图。
(2)功能方面:1.能够实现图的创建以及图的输出。
2.能够返回顶点在图中位置以及图中位置对应顶点的值。
3.返回当前图中的边数与顶点数。
4.返回输入边的权值。
5.能够插入一个顶点或插入顶点与之相关联的边。
6.删除边或删除顶点与之相关联的边。
7.计算顶点的度。
8.实现深度优先搜索、广度优先搜索遍历。
9.Kruskal算法、Prim算法生成最小生成树。
四、系统设计(1)设计的主要思路根据实验要求,首先确定图的存储结构,在根据存储结构编写模板类,并将需要实现的功能代码完善,再写出实现各个功能的菜单并进行调试。
由于在编写由图生成最小生成树中采用了最小堆以及并查集的算法,故需要将这两个个类的代码完成并进行调试。
最后将此次实验所涉及的类全部整理完全后,通过之前编写的菜单对功能进行依次调试,完成此次实验。
(2)数据结构的设计图是非线性结构,它的每一个顶点可以与多个其他顶点相关联,各顶点之间的关系是任意的。
可以用很多方法来存储图结构。
在此采用邻接矩阵来存储图结构。
首先将所有顶点的信息组织成一个顶点表,然后利用一个矩阵来表示各顶点之间的邻接关系,称为邻接矩阵。
下面针对带权无向图的邻接矩阵作出说明。
其中有一个类型为顺序表的顶点表向量VerticesList,用以存储顶点的信息,还有一个作为邻接矩阵使用的二维数组Edge,用以存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关。
算法与数据结构实验报告
算法与数据结构实验报告算法与数据结构实验报告1.引言该实验报告旨在介绍算法与数据结构实验的设计、实施和结果分析。
本章节将概述实验的背景和目的。
2.实验设计2.1 实验背景在本节中,我们将介绍该实验的背景和应用领域,以便读者能够更好地理解实验的重要性。
2.2 实验目的在本节中,我们将详细介绍该实验的目的和预期的成果,以便读者明确实验的研究问题和目标。
3.算法与数据结构概述3.1 算法定义在本节中,我们将简要介绍算法的概念,并讨论其在实验中的应用。
3.2 数据结构定义本节将简要介绍数据结构的概念,并说明其在算法中的作用。
4.算法实现4.1 实验环境和工具本节将介绍实验所使用的环境和工具,包括编程语言、开发平台和相关库。
4.2 算法逻辑设计在本节中,我们将详细描述所选算法的逻辑设计,包括输入、处理和输出过程。
4.3 数据结构设计本节将详细介绍所选算法中使用的数据结构设计,包括数组、链表、栈等。
4.4 算法实现步骤在本节中,我们将逐步介绍算法的实现步骤,包括代码编写和算法调试。
5.实验结果与分析5.1 实验数据收集在本节中,我们将详细介绍实验数据的收集以及所采用的评估指标。
5.2 实验结果展示本节将展示实验结果的统计数据、图表和其他可视化形式,以便读者更好地理解实验结果。
5.3 结果分析在本节中,我们将对实验结果进行分析,讨论其优势、局限性以及可能的改进方向。
6.总结与展望6.1 实验总结本节将对整个实验过程进行总结,并概括实验的主要发现和成果。
6.2 实验展望在本节中,我们将探讨实验结果的未来发展方向,并提出后续研究的建议和展望。
附件:1.数据集:包含实验中使用的原始数据集2.源代码:包含实验所编写的算法代码和实现注释:1.算法:指计算机科学中用来解决问题的可执行指令序列。
2.数据结构:指组织和存储数据的方式,以便能够高效地访问和处理。
算法与数据结构实验报告实验六
算法与数据结构实验报告实验六实验名称:图的应用姓名:卢丽娟学号:211006289专业:软件工程班级:二班指导教师:陈亦萍日期: 2012年6月2日一、实验目的本实验是要根据图的性质,利用图的应用,来求解海盗建造的最少费用二、实验内容与实验步骤实验内容:有N个海岛(标号为1~N)分散在一片的海域上,每个海岛之间没有联系。
对于任意2个岛,它们之间必须直接或间接可以到达。
使用最少的钱数,来完成对这些岛屿的连接。
实验步骤:定义一个Find函数,查找各个顶点在图中的位置int Find(int i)//查找顶点在图中的位置{//判断是否查找成功if(f[i] == i) return i; else { f[i] = Find( f[i] );return f[i];}}再在主函数中调用Find函数,实现对边的求最小权值int main(){ printf("输入顶点数和边数:\n");scanf("%d %d",&n,&m);int i;printf("输入边连接的两个顶点和边的权值:\n");for(i = 1; i <= m; i++) {scanf("%d%d%d",&g[i].s,&g[i].t,&g[i].v);//输入边依附的顶点及权值}sort(g+1,g+m+1);//将其按照升序排列for(i = 1; i <= m; i++) f[i] = i;report= cnt = 0;int cur = 1;for(i = 1; i <= m; i++){ int a = Find(g[i].s);//其在图中位置int b = Find(g[i].t);//其在图中位置if(a != b) {report+= g[i].v; f[a] = b;cnt++;} }//求最小costint sumcost = cnt == n-1? report:-1;printf("结果为:\n");printf("sumcost=%d\n",sumcost);printf("\n"); return 0;}三、实验环境操作系统winXP,开发平台Microsoft Visual C++6.0四、实验过程与分析在调试过程中出现很多错误,有些没有定义,还有就是变量没有设好,大小写问题也出现不少,多括号还有少括号,不然就是漏了分号等,很多细节的错误经过慢慢调试被改正。
数据结构与算法实验报告
数据结构与算法实验报告数据结构与算法实验报告一、实验目的本实验旨在通过实践的方式,加深对数据结构与算法的理解与应用,并能够独立设计和实现常见的数据结构和算法。
二、实验要求1·设计并实现以下数据结构与算法:(按需列出具体数据结构与算法)2·进行性能测试,分析并总结测试结果。
3·撰写实验报告,完整记录实验过程与结果,并进行适当的分析与总结。
三、实验环境(列出实验所需环境,包括操作系统、编程语言及开发环境等)四、实验过程与方法4·1 数据结构设计与实现(首先介绍每个数据结构的功能与特点,然后给出设计思路和实现方法,包括数据结构的定义、操作方法和算法等)4·2 算法设计与实现(首先介绍每个算法的功能与特点,然后给出设计思路和实现方法,包括算法的定义、输入输出格式、算法流程图等)五、实验结果与分析5·1 数据结构性能测试结果(列出数据结构的测试用例及其输入输出,记录测试结果,包括运行时间、空间占用等方面的数据,并进行适当的分析与总结)5·2 算法性能测试结果(列出算法的测试用例及其输入输出,记录测试结果,包括运行时间、空间占用等方面的数据,并进行适当的分析与总结)六、实验总结6·1 实验成果(总结实验所达到的目标,列出已实现的数据结构和算法)6·2 实验心得(记录实验过程中的收获和体会,包括困难与解决方法、感悟和改进方向等)附件:1·实验源码(附上实验所使用的源代码文件,以供参考)2·实验数据(附上实验所用的测试数据文件或数据表格等)法律名词及注释:(列出文档中涉及的法律名词及其注释,以确保读者对相关法律法规的理解)。
数据结构与算法课程实验报告-图的应用
(前面可加目录页)一. 实验目的1.理解图的概念并熟悉有关术语。
2.熟练掌握邻接矩阵表示法和邻接表表示法。
3.掌握连通图遍历的基本思想和算法。
4.掌握最小生成树的有关概念和算法实现。
5.掌握最短路径有关概念和算法。
6.掌握拓扑排序的概念及实现。
二. 实验内容1.对给定的图,用邻接矩阵实现该图的深度优先搜索遍历。
2.对给定的图,用邻接矩阵实现该图的广度优先搜索遍历。
3.对给定的图,用邻接表实现该图的深度优先搜索遍历。
4.对给定的图,用邻接表实现该图的广度优先搜索遍历。
三. 文献综述数据结构(C语言版)习题解答及实训指导------------李根强、谢月娥四. 实验思路和技术路线(数据结构及算法)(1,2)算法设计:首先定义图的类型为结构型,包含图中的顶点信息和邻接矩阵两项信息,然后将输入边的信息建立邻接矩阵,再将深度搜索优先遍历和广度优先搜索遍历写成子函数的形式,在主函数中调用他们;(3,4)算法设计:首先定义图的邻接表数据类型,建立该图的邻接表,然后再用子函数写出深度优先搜索遍历和广度优先搜索遍历的算法,在主函数中调用它;五. 实验结果分析及心得(1)对给定的图,用邻接矩阵实现该图的深度优先和广度优先搜索遍历:<1 给定的图如下:< 2 广度优先和深度优先遍历程序如下:#include<stdio.h>#define n 8 //图中顶点数#define e 15 //图中边数#define elemtype intint visited[n+1]; //访问标志数组,为false表示未访问,为true表示已访问struct graph //定义图的数据类型{elemtype v[n+1]; //存放顶点信息 v1,v2,...,vn,不使用v[0]存储空间int arcs[n+1][n+1]; //邻接矩阵}g;void creatadj() //建立邻接矩阵{int i,j,k;printf("请输入%d个顶点信息\n",n);for(k=1;k<=n;k++)scanf("%d",&g.v[k]); //输入顶点信息for(i=1;i<=n;i++)for(j=1;j<=n;j++)g.arcs[i][j]=0;for(k=1;k<=e;k++){printf("请输入第%d条边,共%d条边",k,e);scanf("%d%d",&i,&j); //输入一条边(i,j)g.arcs[i][j]=1;g.arcs[j][i]=1;}}void dfs(int i) //从顶点i出发进行深度优先搜索遍历 {int j;printf("%d",g.v[i]); //输出访问顶点visited[i]=1; //全局数组访问标记置1表示已访问for(j=1;j<=n;j++)if((g.arcs[i][j]==1)&&(!visited[j]))dfs(j);}void bfs(int i) //从顶点i出发进行广度优先搜索遍历{int q[n+1]; //q为队列int f,r,j; //f,r分别为队列头指针、尾指针f=r=0; //设置空队列printf("%d",g.v[i]); //输出访问顶点visited[i]=1; //全局数组标记置1表示已访问r++;q[r]=i; //入队列while(f<r){f++;i=q[f]; //出队列for(j=1;j<=n;j++)if((g.arcs[i][j]==1)&&(!visited[j])){printf("%d",g.v[j]);visited[j]=1;r++;q[r]=j; //入队列}}}main(){int i,j;int yn=1;creatadj(); //建立邻接矩阵for(i=1;i<=n;i++) //输出邻接矩阵{for(j=1;j<=n;j++)printf("%d",g.arcs[i][j]);printf("\n");}while(yn==1){for(i=1;i<=n;i++)visited[i]=0;printf("请输入深度优先搜索开始访问的顶点");scanf("%d",&i);printf("\n");printf("从%d出发的深度优先搜素遍历序列为\n",i);dfs(i);printf("\n继续进行深度优先搜索吗(1/2)?");scanf("%d",&yn);}yn=1;while(yn==1){for(i=1;i<=n;i++)visited[i]=0;printf("请输入广度优先搜索开始访问的顶点");scanf("%d",&i);printf("\n");printf("从%d出发的广度优先搜索遍历序列为\n",i);bfs(i);printf("\n继续进行广度优先搜索吗 (1/2) ?");scanf("%d",&yn);}}运行结果:#define e 15 //图中边数#define elemtype intint visited[n+1];istruct link{elemtype data;struct link *next;};struct graph{struct link a[n+1];}g;void creatlink(){int i,j,k;struct link *s;for(i=1;i<=n;i++){g.a[i].data=i;g.a[i].next=NULL;}for(k=1;k<=e;k++){printf("请输入一条边");scanf("%d%d",&i,&j);s=(struct link *)malloc(sizeof(struct link));s->data=j;s->next=g.a[i].next;g.a[i].next=s;s=(struct link *)malloc(sizeof(struct link));s->data=i;s->next=g.a[j].next;g.a[j].next=s;}}void dfs1(int i){struct link *p;printf("%d",g.a[i].data);visited[i]=1;p=g.a[i].next;while(p!=NULL){if(!visited[p->data])dfs1(p->data);p=p->next;}}void bfs1(int i){int q[n+1];int f,r;struct link *p;f=r=0;printf("%d",g.a[i].data);visited[i]=1;r++;q[r]=i;while(f<r){f++;i=q[f];p=g.a[i].next;while(p!=NULL){if(!visited[p->data]){printf("%d",g.a[p->data].data);visited[p->data]=1;r++;q[r]=p->data;}p=p->next;}}}main(){struct link *p;int yn=1,i;creatlink();while(yn==1){for(i=1;i<=n;i++){p=g.a[i].next;printf("%d->",g.a[i].data);while(p->next!=NULL){printf("%d->",p->data);p=p->next;}printf("%d\n",p->data);}while(yn==1){for(i=1;i<=n;i++)visited[i]=0;printf("请输入深度优先搜索开始访问的顶点");scanf("%d",&i);printf("\n");printf("从%d出发的深度优先搜索遍历序列为\n",i);dfs1(i);printf("\n继续进行深度优先搜索吗(1/2)?");scanf("%d",&yn);}yn=1;while(yn==1){for(i=1;i<=n;i++)。
算法与数据结构实验报告
算法与数据结构实验报告算法与数据结构实验报告引言算法与数据结构是计算机科学中的两个重要概念。
算法是解决问题的一系列步骤或规则,而数据结构是组织和存储数据的方式。
在本次实验中,我们将探索不同的算法和数据结构,并通过实际的案例来验证它们的效果和应用。
一、排序算法排序算法是计算机科学中最基础的算法之一。
在本次实验中,我们实现了冒泡排序、插入排序和快速排序算法,并对它们进行了比较。
冒泡排序是一种简单但低效的排序算法。
它通过多次遍历待排序的元素,每次比较相邻的两个元素并交换位置,将较大的元素逐渐“冒泡”到数组的末尾。
尽管冒泡排序的时间复杂度为O(n^2),但它易于实现且适用于小规模的数据集。
插入排序是一种更高效的排序算法。
它将待排序的元素依次插入已排好序的部分中,直到所有元素都被插入完毕。
插入排序的时间复杂度为O(n^2),但对于部分有序的数据集,插入排序的效率会更高。
快速排序是一种常用的排序算法,它采用分治的思想。
快速排序的基本思路是选择一个基准元素,将小于基准的元素放在基准的左边,大于基准的元素放在基准的右边,然后对左右两部分分别进行快速排序。
快速排序的时间复杂度为O(nlogn),但在最坏情况下会退化为O(n^2)。
通过实际的实验数据,我们发现快速排序的效率远高于冒泡排序和插入排序。
这是因为快速排序采用了分治的策略,将原始问题划分为更小的子问题,从而减少了比较和交换的次数。
二、查找算法查找算法是在给定数据集中寻找特定元素的算法。
在本次实验中,我们实现了线性查找和二分查找算法,并对它们进行了比较。
线性查找是一种简单但低效的查找算法。
它通过逐个比较待查找的元素和数据集中的元素,直到找到匹配的元素或遍历完整个数据集。
线性查找的时间复杂度为O(n),适用于小规模的数据集。
二分查找是一种更高效的查找算法,但要求数据集必须是有序的。
它通过将数据集划分为两部分,并与中间元素进行比较,从而确定待查找元素所在的部分,然后再在该部分中进行二分查找。
数据结构图实验报告
数据结构图实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构图的基本概念、原理和操作方法,通过实际编程和操作,提高对数据结构的应用能力和解决问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容(一)线性表1、顺序表实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈实现顺序栈和链式栈。
用栈解决表达式求值问题。
2、队列实现顺序队列和链式队列。
用队列模拟银行排队问题。
(三)树1、二叉树实现二叉树的创建、遍历(前序、中序、后序)。
计算二叉树的深度和节点数。
2、二叉搜索树实现二叉搜索树的插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储实现邻接矩阵和邻接表两种图的存储方式。
比较两种存储方式的优缺点。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
用图的遍历解决最短路径问题。
四、实验步骤(一)线性表1、顺序表定义一个数组来存储顺序表的元素,并使用一个变量记录当前表的长度。
插入操作时,需要判断插入位置是否合法,如果合法则将插入位置后的元素依次向后移动一位,然后将新元素插入指定位置。
删除操作时,先判断删除位置是否合法,合法则将删除位置后的元素依次向前移动一位,并更新表的长度。
查找操作通过遍历数组来实现。
分析不同操作的时间复杂度,插入和删除操作在最坏情况下为O(n),查找操作在平均情况下为 O(n/2)。
2、链表对于单链表,定义一个节点结构体,包含数据域和指向下一个节点的指针域。
通过操作指针来实现插入、删除和查找操作。
双向链表则在节点结构体中增加指向前一个节点的指针,使得操作更加灵活,但也增加了空间复杂度。
比较单链表和双向链表在插入、删除操作中指针的调整过程,得出双向链表在某些情况下更方便,但空间开销较大的结论。
算法与数据结构实验报告
算法与数据结构实验报告算法与数据结构实验报告1.实验目的1.1 研究和掌握算法与数据结构基本概念和原理。
1.2 学习并运用各类算法和数据结构解决实际问题。
1.3 提高编程和问题解决能力。
2.实验环境2.1 操作系统:________Windows 10。
2.2 开发工具:________Visual Studio Code。
2.3 编程语言:________C++。
3.实验内容3.1 实验一:________线性表的实现和应用a. 顺序表的实现及其基本操作b. 链表的实现及其基本操作c. 线性表的应用:________实现一个简单的购物车系统3.2 实验二:________栈和队列的实现和应用a. 栈的实现及其基本操作b. 队列的实现及其基本操作c. 栈和队列的应用:________实现一个迷宫求解算法3.3 实验三:________树的实现和应用a. 二叉树的实现及其基本操作b. 二叉查找树的实现及其基本操作c. 树的应用:________实现一个文件目录管理系统4.实验结果与分析4.1 实验一的结果与分析a. 实验一的测试数据b. 实验一的测试结果c. 实验一的结果分析4.2 实验二的结果与分析a. 实验二的测试数据b. 实验二的测试结果c. 实验二的结果分析4.3 实验三的结果与分析a. 实验三的测试数据b. 实验三的测试结果c. 实验三的结果分析5.实验总结5.1 实验过程中的收获和体会5.2 实验中遇到的问题及解决方法5.3 对算法与数据结构的认识和体会6.附件本文档涉及附件:________实验源代码、测试数据文件、实验报告的电子版本。
7.法律名词及注释7.1 版权:________指对创建的文学、艺术、科学作品所享有的独占权利。
7.2 专利:________指为了保护发明者创作的新技术、新产品或新设计所实施的一种法律制度。
数据结构与算法实验报告
数据结构与算法实验报告数据结构与算法实验报告1.引言在本实验中,我们将研究和实现一些经典的数据结构和算法,以及它们在各种问题中的应用。
本文档详细介绍了每个实验的目标、方法、结果和分析。
2.实验一:线性表的操作2.1 实验目标本实验旨在熟悉线性表的基本操作,并通过实践掌握线性表的顺序存储结构和链式存储结构的实现。
2.2 实验方法2.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code2.2.2 实验步骤1.实现顺序存储结构的线性表。
2.实现链式存储结构的线性表。
3.通过编写测试用例,验证线性表的各种操作。
2.3 实验结果与分析通过实验,我们完成了线性表的顺序存储结构和链式存储结构的实现,并且通过测试用例验证了它们的正确性。
3.实验二:树的操作3.1 实验目标本实验旨在熟悉树的基本操作,并通过实践掌握二叉树和平衡二叉树的实现。
3.2 实验方法3.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code3.2.2 实验步骤1.实现二叉树的基本操作,如插入节点、删除节点等。
2.实现平衡二叉树,并保持其平衡性。
3.通过编写测试用例,验证树的各种操作。
3.3 实验结果与分析通过实验,我们完成了二叉树和平衡二叉树的实现,并且通过测试用例验证了它们的正确性。
4.实验三:图的操作4.1 实验目标本实验旨在熟悉图的基本操作,并通过实践掌握图的表示方法和常用算法。
4.2 实验方法4.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code4.2.2 实验步骤1.实现图的邻接矩阵表示法和邻接链表表示法。
2.实现图的深度优先搜索和广度优先搜索算法。
3.通过编写测试用例,验证图的各种操作和算法的正确性。
4.3 实验结果与分析通过实验,我们完成了图的邻接矩阵表示法和邻接链表表示法的实现,以及深度优先搜索和广度优先搜索算法的实现,并且通过测试用例验证了它们的正确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号:XH03JW024-05/0 实训(验)报告
班级:姓名:座号:指导教师:成绩:
课程名称:算法与数据结构实训(验):实验六图的应用2011年12月9 日
一、实验目的:
1、掌握图的两种存储结构;
2、掌握图深度优先遍历的基本思想;
3、掌握图广度优先遍历的基本思想。
二、实训(验)内容、记录和结果(含数据、图表、计算、结果分析等)
1、程序源代码:
// (以下为邻接表的队操作)
void init1(linkqueue *q)
{
q->front=q->rear=(queue)malloc(sizeof(node));
q->front->next=NULL;
}
void ENQUEUE1(linkqueue *q, int v)
{
queue P;
P=(queue)malloc(sizeof(node));
P->data=ga[v].vertex;
P->next=NULL;
q->rear->next=P;
q->rear=P;
}
int DEQUEUE(linkqueue *q)
{
int k=0,u;
queue P;
P=q->front->next;
while(ga[k].vertex!=P->data)
k++;
u=k;
q->front->next=P->next;
if(q->rear==P)
q->rear=q->front;
return u;
}
int isempty1(linkqueue *q)
{
if(q->front==q->rear)
return 1;
else
return 0;
}
void CREATADJLIST(VerNode ga[]) /*建立无向图的邻接表*/ {
int i,j,k;
EdgeNode *s;
getchar();
for(i=0;i<n1;i++) /*读入顶点信息*/
{
printf("请输入第%d顶点信息:",i+1);
ga[i].vertex=getchar();
getchar();
ga[i].firstedge=NULL; /*边表头指针初始化*/
}
for(k=0;k<e1;k++) /*建立边表*/
{
printf("请输入边表信息(Vi,Vj)\n");
scanf("%d,%d",&i,&j);
s=malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=ga[i].firstedge;
ga[i].firstedge=s;
}
}
DFSL(int i) /*以Vi为出发点对邻接表存储的图G进行DFS搜索*/ {
EdgeNode *p;
printf("node:%c\n",ga[i].vertex);/*访问顶点Vi*/
visited1[i]=1; /*标记Vi已访问*/
p=ga[i].firstedge; /*取Vi边表的头指针*/
while(p) /*依次搜索Vi的邻接点Vj*/
{ /*若Vj尚未访问,则以Vj为出发点向纵深搜索*/
if(!visited1[p->adjvex])
DFSL(p->adjvex);
p=p->next; /*找Vi的下一个邻接点*/ }
}
BFSL(int k) //广度优先搜索邻接表表示的图
{ int i;
EdgeNode *p;
linkqueue Q;
init1(&Q);
printf("%c\n",ga[k].vertex);
visited1[k]=1;
ENQUEUE1(&Q,k);
while(!isempty1(&Q))
{ i=DEQUEUE(&Q);
p=ga[i].firstedge; //取vi的边表头指针
while(p) //依次搜索vi的邻接点
{ //访问vi的未曾访问过的邻接点
if(!visited[p->adjvex])
{ printf("%c\n",ga[p->adjvex].vertex);
visited[p->adjvex]=1;
//访问过的顶点入队
ENQUEUE1(&Q,p->adjvex);
}
p=p->next;//找vi的下一个邻接点
}
}
}
2、声明:本实验以以下图作为实验的原始数据。
(1)、邻接矩阵的结果如下图:
(4)、邻接表的结果如下图:
三、实验总结:
通过这节课的学习让我知道了一个基本图的遍历问题,前面不在从何下手,后来找到一点头绪,经过老师的提醒,终于有点头绪,老师已经给出邻接矩阵的代码,所以我们就可以模仿矩阵的来写,然后再按照课本上的代码,再进行一定的修改就完成了此次实验,在做的过程中还是遇到了许多的问题,因为自身掌握的层面还是有限的,所以相对来说还是有一定的难度的,只能希望自己在以后的作业中能更加的完善自己的知识面,能够更加懂的去纠正错误,能够不在老师的提醒就能够有思路。
本文来自:。