图的基本操作-遍历的实现
- 格式:doc
- 大小:73.50 KB
- 文档页数:8
图的基本操作实验报告图的基本操作实验报告引言:图是一种常见的数据结构,广泛应用于计算机科学和其他领域。
本实验报告旨在介绍图的基本操作,包括创建图、添加节点和边、遍历图等,并通过实验验证这些操作的正确性和效率。
实验目的:1. 了解图的基本概念和术语;2. 掌握图的创建和修改操作;3. 熟悉图的遍历算法;4. 分析图的操作的时间复杂度。
实验过程:1. 创建图首先,我们需要创建一个图对象。
图可以用邻接矩阵或邻接表来表示。
在本实验中,我们选择使用邻接表来表示图。
通过遍历输入的节点和边信息,我们可以创建一个包含所有节点和边的图。
2. 添加节点和边在创建图对象后,我们可以通过添加节点和边来构建图的结构。
通过输入节点的标识符和边的起始和结束节点,我们可以在图中添加新的节点和边。
添加节点和边的操作可以通过修改邻接表来实现,将节点和边的信息存储在对应的链表中。
3. 遍历图遍历图是图操作中常用的操作之一。
通过遍历图,我们可以访问图中的所有节点和边。
在本实验中,我们选择使用深度优先搜索(DFS)算法来遍历图。
DFS算法通过递归的方式遍历图中的节点,先访问当前节点,然后再递归地访问与当前节点相邻的节点。
4. 分析时间复杂度在实验过程中,我们记录了图的操作所花费的时间,并分析了它们的时间复杂度。
通过对比不同规模的图的操作时间,我们可以评估图操作的效率和可扩展性。
实验结果:通过实验,我们成功创建了一个图对象,并添加了多个节点和边。
我们还通过DFS算法遍历了图,并记录了遍历的顺序。
实验结果表明,我们的图操作实现正确,并且在不同规模的图上都能够高效地工作。
讨论与结论:本实验报告介绍了图的基本操作,并通过实验验证了这些操作的正确性和效率。
通过实验,我们了解到图是一种重要的数据结构,可以用于解决许多实际问题。
同时,我们还深入分析了图操作的时间复杂度,为后续的图算法设计和优化提供了参考。
总结:通过本次实验,我们对图的基本操作有了更深入的了解。
数据结构大纲知识点一、绪论。
1. 数据结构的基本概念。
- 数据、数据元素、数据项。
- 数据结构的定义(逻辑结构、存储结构、数据的运算)- 数据结构的三要素之间的关系。
2. 算法的基本概念。
- 算法的定义、特性(有穷性、确定性、可行性、输入、输出)- 算法的评价指标(时间复杂度、空间复杂度的计算方法)二、线性表。
1. 线性表的定义和基本操作。
- 线性表的逻辑结构特点(线性关系)- 线性表的基本操作(如初始化、插入、删除、查找等操作的定义)2. 顺序存储结构。
- 顺序表的定义(用数组实现线性表)- 顺序表的基本操作实现(插入、删除操作的时间复杂度分析)- 顺序表的优缺点。
3. 链式存储结构。
- 单链表的定义(结点结构,头指针、头结点的概念)- 单链表的基本操作实现(建立单链表、插入、删除、查找等操作的代码实现及时间复杂度分析)- 循环链表(与单链表的区别,操作特点)- 双向链表(结点结构,基本操作的实现及特点)三、栈和队列。
1. 栈。
- 栈的定义(后进先出的线性表)- 栈的基本操作(入栈、出栈、取栈顶元素等操作的定义)- 顺序栈的实现(存储结构,基本操作的代码实现)- 链栈的实现(与单链表的联系,基本操作的实现)- 栈的应用(表达式求值、函数调用栈等)2. 队列。
- 队列的定义(先进先出的线性表)- 队列的基本操作(入队、出队、取队头元素等操作的定义)- 顺序队列(存在的问题,如假溢出)- 循环队列的实现(存储结构,基本操作的代码实现,队空和队满的判断条件)- 链队列的实现(结点结构,基本操作的实现)- 队列的应用(如操作系统中的进程调度等)四、串。
1. 串的定义和基本操作。
- 串的概念(字符序列)- 串的基本操作(如连接、求子串、比较等操作的定义)2. 串的存储结构。
- 顺序存储结构(定长顺序存储和堆分配存储)- 链式存储结构(块链存储结构)3. 串的模式匹配算法。
- 简单的模式匹配算法(Brute - Force算法)的实现及时间复杂度分析。
VTK图像基本操作_图像像素值的访问与修改1.直接访问图像像素(索引法)1 #include <vtkAutoInit.h>2 VTK_MODULE_INIT(vtkRenderingOpenGL);34 #include <vtkSmartPointer.h>5 #include <vtkImageData.h>6 #include <vtkBMPReader.h>7 #include <vtkImageViewer2.h>8 #include <vtkRenderer.h>9 #include <vtkRenderWindow.h>10 #include <vtkRenderWindowInteractor.h>1112int main()13 {14 vtkSmartPointer<vtkBMPReader> reader =15 vtkSmartPointer<vtkBMPReader>::New();16 reader->SetFileName("lena.bmp");17 reader->Update();1819int dims[3];20 reader->GetOutput()->GetDimensions(dims);2122int nbofComp;23 nbofComp = reader->GetOutput()->GetNumberOfScalarComponents();2425for (int k = 0; k < dims[2]; k++)26 {27for (int j = 0; j < dims[1]; j++)28 {29for (int i = 0; i < dims[0]; i++)30 {31if (i < 384 && i > 128 && j > 128 && j < 384)32 {33 unsigned char *pixel = (unsigned char *)(reader->GetOutput()->GetScalarPointer(i, j, k));34 *pixel = 255 - *pixel;35 *(pixel + 1) = 255 - *(pixel + 1);36 *(pixel + 2) = 255 - *(pixel + 2);37 }38 }39 }40 }4142 vtkSmartPointer<vtkImageViewer2> imgViewer =43 vtkSmartPointer<vtkImageViewer2>::New();44 imgViewer->SetInputData(reader->GetOutput());4546 vtkSmartPointer<vtkRenderWindowInteractor> rwi =47 vtkSmartPointer<vtkRenderWindowInteractor>::New();48 imgViewer->SetupInteractor(rwi);49 imgViewer->Render();50 imgViewer->GetRenderer()->ResetCamera();51 imgViewer->Render();52 imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);53 imgViewer->SetSize(640, 480);54 imgViewer->GetRenderWindow()->SetWindowName("VisitImagePixelDirectly");5556 rwi->Start();5758return0;59 }输出结果:上述案例实现了将图像的100*100⼤⼩的区域设置为反⾊。
中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。
算法与数据结构大纲一、课程简介算法与数据结构是计算机科学中的核心基础课程,旨在介绍算法设计和数据结构的基本概念、原理和方法,培养学生的算法思维和问题解决能力。
二、教学目标1. 了解算法与数据结构的基本概念和原理;2. 掌握常见的数据结构及其操作;3. 学习常见的算法设计策略和分析方法;4. 能够运用所学知识解决实际问题。
三、教学内容1. 算法基础- 算法的概念和特征- 算法的表示方法- 算法的分析:时间复杂度和空间复杂度2. 数据结构基础- 数据结构的概念和分类- 抽象数据类型- 数据结构的操作和实现3. 线性结构- 数组- 链表- 栈和队列4. 树状结构- 树的概念和基本操作- 二叉树- 二叉搜索树- 平衡二叉树5. 图状结构- 图的概念和基本操作- 图的存储和表示- 图的遍历6. 排序算法- 插入排序- 选择排序- 冒泡排序- 快速排序- 归并排序7. 查找算法- 顺序查找- 二分查找- 哈希查找8. 算法设计策略- 分治法- 动态规划法- 回溯法- 贪心算法四、教学方法1. 理论讲解:通过课堂讲解,介绍算法与数据结构的基本概念、原理和方法;2. 编程实践:通过编程练习,让学生掌握数据结构的实现和算法的应用;3. 案例分析:通过实际问题的解决,让学生学会运用所学知识解决实际问题;4. 小组讨论:通过小组讨论,培养学生的团队合作和问题解决能力。
五、考核方式1. 平时作业:包括课后作业、编程练习和课堂表现等;2. 期中考试:考核学生对前半部分教学内容的掌握程度;3. 期末考试:考核学生对整个课程内容的掌握程度。
六、教学资料1. 教材:《算法与数据结构》(教材名称),(作者)著,(出版社)出版;2. 参考资料:《数据结构与算法分析》(参考书名称),(作者)著,(出版社)出版。
七、教学设备1. 计算机实验室;2. 投影仪;3. 编程软件。
第1章绪论◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的一个子集。
数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。
抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。
◆算法算法:是指解题方案的准确而完整的描述。
算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。
算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。
特征包括:(1)可行性;(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性;(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义;(4)拥有足够的情报。
算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。
指令系统:一个计算机系统能执行的所有指令的集合。
基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。
算法的控制结构:顺序结构、选择结构、循环结构。
算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。
算法复杂度:算法时间复杂度和算法空间复杂度。
算法时间复杂度是指执行算法所需要的计算工作量。
算法空间复杂度是指执行这个算法所需要的内存空间。
for ( i = 1 , i < = 10 , i++ ) x=x+c; =>O(1)for ( i = 1 , i < = n , i++ ) x=x+n; =>O(n)多嵌套一个for,则为=>O(n^2) 以此类推真题难点:i = 1,while(i < = n)i = i * 3;=>O(log3^n)i = i * 2;=>O(log2^n) 以此类推数据的逻辑结构有以下两大类:线性结构:有且仅有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前驱和一个直接后继。
《数据结构》考试大纲(专升本)一、考试性质《数据结构》是计算机科学与技术专业的核心课程,是计算机专业专升本入学考试的必考科目之一。
数据结构是计算机程序设计的重要理论基础,主要研究数据的各种内在规律和特性,以及如何在计算机中实现和应用这些规律和特性。
通过对数据结构的学习,可以使考生掌握数据的组织、存储和处理的基本方法,培养考生运用所学知识解决实际问题的能力。
二、考试目标本考试的目的是测试考生对数据结构基本概念、基本原理和基本方法的掌握程度和应用能力。
具体来说,考试应达到以下目标:1. 掌握数据结构的基本概念、基本原理和基本方法,包括数据的逻辑结构、存储结构和算法等。
2. 掌握线性表、栈、队列、树、图等基本数据结构的定义、表示和操作,理解它们的特性和应用场景。
3. 掌握常见的数据结构算法,包括查找、排序、图论算法等,能够分析和评估算法的时间复杂度和空间复杂度。
4. 了解数据结构的实际应用,如动态内存分配、数据压缩、文件存储管理等。
三、考试内容1. 数据结构的基本概念:数据的逻辑结构、存储结构、算法的描述与实现等。
2. 线性表:顺序表和链表的定义、表示和操作,包括插入、删除、查找等操作的时间复杂度分析。
3. 栈:栈的定义、表示和操作,包括入栈、出栈、判断栈是否为空等操作的时间复杂度分析。
4. 队列:队列的定义、表示和操作,包括入队、出队、判断队列是否为空等操作的时间复杂度分析。
5. 树:树的基本概念,包括树、森林、二叉树等;二叉树的定义、表示和操作,包括插入、删除节点等操作的时间复杂度分析;二叉搜索树、平衡二叉树等数据结构的定义和操作。
6. 图:图的基本概念,包括无向图、有向图等;图的表示方法,包括邻接矩阵和邻接表等;图的遍历算法,包括深度优先搜索和广度优先搜索等;最小生成树的概念和构造方法(Prim算法和Kruskal算法);最短路径算法(Dijkstra算法和Floyd-Warshall算法)等。
课程名称:数据结构课时安排:2课时教学目标:1. 知识目标:- 理解数据结构的基本概念和重要性。
- 掌握线性表、栈、队列、链表等基本数据结构。
- 了解树和图的基本概念和常用算法。
2. 能力目标:- 能够根据实际问题选择合适的数据结构。
- 能够设计简单的数据结构程序。
- 能够分析数据结构的时空复杂度。
3. 情感目标:- 培养学生对数据结构的兴趣和好奇心。
- 增强学生的逻辑思维能力和解决问题的能力。
教学重点:1. 线性表、栈、队列、链表的基本概念和操作。
2. 树和图的基本概念和常用算法。
教学难点:1. 链表和树结构的实现。
2. 复杂算法的分析。
教学准备:1. 教师准备:多媒体课件、实验指导书、相关教材。
2. 学生准备:笔记本、笔。
教学过程:第一课时一、导入1. 引入数据结构的概念,强调其在计算机科学中的重要性。
2. 提问:数据结构有哪些作用?举例说明。
二、新课讲解1. 线性表:- 定义:线性表是具有相同数据类型的有限序列。
- 常见线性表:数组、链表。
- 线性表的插入、删除、查找等操作。
2. 栈:- 定义:栈是一种后进先出(LIFO)的线性表。
- 栈的基本操作:入栈、出栈、判空、取栈顶元素等。
3. 队列:- 定义:队列是一种先进先出(FIFO)的线性表。
- 队列的基本操作:入队、出队、判空、取队首元素等。
三、课堂练习1. 学生独立完成以下练习题:- 实现一个线性表的插入操作。
- 实现一个栈的出栈操作。
- 实现一个队列的入队操作。
四、总结1. 回顾本节课所学内容,强调数据结构的基本概念和操作。
2. 提醒学生注意课后复习,为下一节课做准备。
第二课时一、复习1. 回顾上一节课所学内容,提问学生相关知识点。
2. 学生回答问题,教师进行点评。
二、新课讲解1. 链表:- 定义:链表是一种由节点组成的线性表。
- 链表的基本操作:创建、插入、删除、查找等。
2. 树:- 定义:树是一种非线性结构,由节点组成,节点之间具有层次关系。
《数据结构》实验报告网络081200800824126甘春泉实验五图的遍历及其应用实现一、实验目的1.熟悉图常用的存储结构。
2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。
3.会用图的遍历解决简单的实际问题。
二、实验内容[题目一] :从键盘上输入图的顶点和边的信息,建立图的邻接表存储结构,然后以深度优先搜索和广度优先搜索遍历该图,并输出起对应的遍历序列. 试设计程序实现上述图的类型定义和基本操作,完成上述功能。
该程序包括图类型以及每一种操作的具体的函数定义和主函数。
三、实验步骤㈠、数据结构与核心算法的设计描述依次输入顶点偶对,建立无向图邻接表void CreatGraphAdList(ALGraph &G) // 依次输入顶点偶对,建立无向图邻接表{ArcNode *p;int i,j,k,m;cout<<"请输入无向图顶点的数目"<<endl;cin>>G.vexnum;cout<<"请输入无向图弧的数目"<<endl;cin>>G.arcnum;for(k=1;k<=G.vexnum;k++)G.vertices[k].firstarc=NULL;//初始化每个链表为空for(m=1;m<=G.arcnum;m++){cout<<"输入一条边的两个顶点序号"<<endl;cin>>i>>j; //输入一条边依附的两个顶点的序号p=(ArcNode *)malloc(sizeof(ArcNode)); //生成一个结点p->adjvex=j; //为结点j的序号赋值p->data=j; //假设结点数据域为整型,且以结点序号为其值p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p; //将结点j插入到第i个链表p=(ArcNode *)malloc(sizeof(ArcNode)); //生成一个结点p->adjvex=i;p->data=i;p->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p; //将结点i插入到第j个链表// cin>>i>>j; //再次输入下一条边的两个顶点序号}}从第v个顶点出发递归的深度优先遍历图void DFS(ALGraph &G,int v,int flag[]){//从第v个顶点出发递归的深度优先遍历图ArcNode *p;int i;flag[v]=1;cout<<v;for(p=G.vertices[v].firstarc;p!=NULL;p=p->nextarc){i=p->adjvex;if(flag[i]==0)DFS(G,i,flag);}}对整个图G作深度优先遍历void GraphDFS(ALGraph &G) //对整个图G作深度优先遍历{int v;int flag[MAX_VERTEX_NUM];for(v=1;v<=G.vexnum;v++)flag[v]=0;for(v=1;v<=G.vexnum;v++){if(flag[v]==0)DFS(G,v,flag);}cout<<endl;}从第v个顶点出发对图G进行广度优先搜索void BFS(ALGraph &G,int v,int flag[]){//从第v个顶点出发对图G进行广度优先搜索int que[MAX_VERTEX_NUM]; //用队列que进行处理int front=0,rear=0; //front,rear分别为队头队尾ArcNode *p;flag[v]=1;cout<<v;que[0]=v;while(front<=rear) //当队不为空时{v=que[front++]; //访问过的顶点出队p=G.vertices[v].firstarc; //p指向v的第一个邻接边while(p!=NULL){v=p->adjvex;if(flag[v]==0){flag[v]=1;cout<<v;que[++rear]=v; //访问过的顶点入队}p=p->nextarc; //访问p的下一个邻接边}}}对整个图G作广度优先遍历void GraphBFS(ALGraph &G) //对整个图G作广度优先遍历{int v;for(v=1;v<=G.vexnum;v++)flag[v]=0;for(v=1;v<=G.vexnum;v++){if(flag[v]==0)BFS(G,v,flag);}cout<<endl;}构造一个空队列void InitQueue(LinkQueue &Q)// 构造一个空队列{Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(1);Q.front->next=NULL;}插入元素v为新的队尾元素int EnQueue(LinkQueue &Q,QElemType v)//插入元素v为新的队尾元素{QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p) exit(1);p->data=v;p->next=NULL;Q.rear->next=p;Q.rear=p;return 0;}检查队列是否为空int EmptyQueue(LinkQueue &Q)//检查队列是否为空{if(Q.front==Q.rear) //队列为空返回1,否则返回0return 1;elsereturn 0;}删除队列的队头元素int DeQueue(LinkQueue &Q,QElemType v)//删除队列的队头元素{QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p) exit(1);if(Q.front==Q.rear) return 0;else{p=Q.front->next;v=p->data;Q.front->next=p->next;}if(Q.rear==p)Q.rear=Q.front;free(p);return (v);}对图进行广度优先搜索遍历该图,并输出起对应的遍历序void BFSTraverse(ALGraph &G,int v,int flag[]){//对图进行广度优先搜索遍历该图,并输出起对应的遍历序LinkQueue Q;ArcNode *p;for(v=1;v<=G.vexnum;v++)flag[v]=0;InitQueue(Q);for(v=1;v<=G.vexnum;v++)if(flag[v]==0){flag[v]=1;cout<<v;EnQueue(Q,v);while(!EmptyQueue(Q)) //当队列不空{DeQueue(Q,v);for(p=G.vertices[v].firstarc;p!=NULL;p=p->nextarc){v=p->data;if(flag[v]==0){flag[v]=1;cout<<v;EnQueue(Q,v);}}}//while}//ifcout<<endl;}//BFSTraverse㈡、函数调用及主函数设计int main(){ALGraph G;int flag[MAX_VERTEX_NUM],v=1;cout<<"建立图的邻接表存储结构"<<endl;CreatGraphAdList(G);cout<<"图的深度优先搜索遍历"<<endl;GraphDFS(G);cout<<"图的广度优先搜索遍历1"<<endl;GraphBFS(G);cout<<"图的广度优先搜索遍历2"<<endl;BFSTraverse(G,v,flag);return 0;}㈢程序调试及运行结果分析依次输入顶点偶对,建立无向图G的邻接表以深度优先搜索和广度优先搜索遍历图G,并输出起对应的遍历序列(四)主要算法流程图:四、实验总结在深度优先搜索算法中,是深度越大的结点越先得到扩展。
广度优先搜索遵循从初始结点开始一层层扩展直到找到目标结点的搜索规则,在进行广度优先搜索遍历图时,使用了循环队列和链表队列。
使用循环队列时相对来说较为容易。