数据结构图的存储结构及基本操作
数据结构-chap7 (1)图的存储结构

V2
V4 G2图示
无向图:在图G中,若所有边是无向边,则称G为无向图。
有向图:在图G中,若所有边是有向边,则称G为有向图。
二、图的基本术语
有向完全图: n个顶点的有向图最大边数是n(n-1) 无向完全图: n个顶点的无向图最大边数是n(n-1)/2 1、邻接点及关联边
主要内容
知识点
– – – – 1.图的定义,概念、术语及基本操作。 2.图的存储结构,特别是邻接矩阵和邻接表。 3.图的深度优先遍历和宽度优先遍历。 4.图的应用(连通分量,最小生成树,拓扑排序,关键路经,最短 路经)。 1.基本概念中,完全图、连通分量、生成树和邻接点是重点。 2.建立图的各种存储结构的算法。 3.图的遍历算法及其应用。 4.通过遍历求出连通分量的个数,深(宽)度优先生成树。 5.最小生成树的生成过程。 6.拓扑排序的求法。关键路经的求法。 7.最短路径的手工模拟。
自测题 2
设无向图的顶点个数为n,则该图最多有( )条边。 A.n-1
B.n(n-1)/2
C.n(n+1)/2 D.0 E.N2 【清华大学1998一.5(分)】
自测题 3
一个有n个结点的图,最少有( )个连通分量,最多有( )个 连通分量。
A. 0
B.1 C.n-1 D.n 【北京邮电大学 2000 二.5 (20/8分)】
0
V1 e1 V3 V4 V5 V2 1 0 1 0 1
否则
0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 V1 V2 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0
数据结构中常用的逻辑结构和存储结构

数据结构中常用的逻辑结构和存储结构一、概念数据是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。
结构是元素之间的关系的集合。
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。
数据结构有逻辑上的数据结构和物理上的数据结构之分。
逻辑上的数据结构反映成分数据之间的逻辑关系即逻辑结构,而物理上的数据结构反映成分数据在计算机内部的存储安排即存储结构。
数据结构是数据存在的形式。
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
因而研究数据结构的逻辑结构与存储结构显得十分重要。
二、结构分析(一)逻辑结构数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。
逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
逻辑结构元素决定输入、存储、发送、处理和信息传递的基本操作功能,常将逻辑结构元素称为逻辑模块。
逻辑结构元素可以是计算机操作系统、终端模块、通信程序模块等。
逻辑结构元素还可以是相关的几个逻辑模块联合起来的更复杂的实体。
分析逻辑结构元素的相互作用,应考虑整个系统的操作,研究处理与信息流有关的进程(操作系统中的一个概念,表示程序的一次执行),并决定系统的逻辑资源。
逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。
表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现。
数据结构试验报告-图的基本操作

中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科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;}。
数据结构ppt课件

二叉树具有五种基本形态,即空二叉树、只有一个根节点的二叉树、只有左子树或右子 树的二叉树、以及左右子树均有的二叉树。此外,二叉树还具有一些重要性质,如二叉
树的第i层最多有2^(i-1)个节点(i>=1),深度为k的二叉树最多有2^k-1个节点 (k>=1)等。
二叉树的遍历算法
先序遍历
先访问根节点,然后遍 历左子树,最后遍历右
05
图论基础及图的存储结构
图论基础概念介绍
图的基本概念
由顶点(Vertex)和边(Edge)组成的数 据结构,表示对象及其之间的关系。
图的遍历
通过某种方式访问图中所有顶点的过程, 常见的遍历算法有深度优先遍历(DFS)和 广度优先遍历(BFS)。
有向图与无向图
根据边是否有方向,图可分为有向图和无 向图。
时间复杂度
平均时间复杂度和最坏时 间复杂度均为O(n)。
适用场景
适用于数据量较小或数据 无序的情况。
查找算法设计之二分查找法
算法思想
在有序数组中,取中间元素与目标元素比较,若相等则查找成功;若目标元素小于中间元素, 则在左半部分继续查找;若目标元素大于中间元素,则在右半部分继续查找。
时间复杂度
平均时间复杂度和最坏时间复杂度均为O(log n)。
连通图与连通分量
在无向图中,任意两个顶点之间都存在路 径,则称该图是连通图;否则,称该图的 极大连通子图为连通分量。
顶点的度
在无向图中,顶点的度是与该顶点相关联 的边的数目;在有向图中,顶点的度分为 入度和出度。
图的存储结构之邻接矩阵法
邻接矩阵表示法
用一个二维数组表示图中顶点之 间的关系,若顶点i与顶点j之间 存在一条边,则数组元素值为1
数据结构图知识点总结高中

数据结构图知识点总结高中一、线性结构1. 线性表线性表是数据结构中最基本的一种结构,它是由零个或多个数据元素构成的有限序列。
其中每个数据元素都只有一个前驱元素和一个后继元素,除了第一个和最后一个元素外,其他元素都有且仅有一个前驱和一个后继。
线性表有两种基本的存储结构,分别是顺序存储结构和链式存储结构。
顺序存储结构是利用一组地址连续的存储单元来存放线性表的数据元素,而链式存储结构是通过指针来表示数据元素之间的逻辑关系。
2. 栈栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
栈有一个被称为栈顶的元素,只能在栈顶进行插入和删除操作。
栈有两种经典的存储结构,分别是顺序栈和链式栈。
顺序栈是利用数组来实现栈的存储和操作,而链式栈则是利用链表来实现栈的存储和操作。
3. 队列队列也是一种特殊的线性表,它只能在表的两端进行插入和删除操作。
队列有一个被称为队头和队尾的元素,只能在队头进行删除操作,只能在队尾进行插入操作。
队列也有两种经典的存储结构,分别是顺序队列和链式队列。
顺序队列是利用数组来实现队列的存储和操作,而链式队列则是利用链表来实现队列的存储和操作。
4. 串串是线性表的一种特殊形式,它是由零个或多个字符构成的有限序列。
串的存储结构有两种常见的形式,分别是顺序存储结构和链式存储结构。
顺序存储结构是利用数组来存储串的字符序列,而链式存储结构是利用链表来存储串的字符序列。
二、非线性结构1. 树树是一种非线性结构,它是由n (n ≥ 1) 个节点组成的有限集合,这些节点之间存在着明确的层次关系。
树的存储结构通常有两种形式,分别是双亲表示法和孩子表示法。
双亲表示法通过数组来存储树的节点和节点之间的关系,而孩子表示法则通过链表来存储树的节点和节点之间的关系。
树有许多种特殊形式,如二叉树、平衡二叉树、多路查找树等。
其中,二叉树是一种特殊的树,它的每个节点最多有两个子节点,这两个子节点被称为左子树和右子树。
2. 图图是一种非线性结构,它是由一组顶点和一组边组成的数据结构。
数据结构图

所以:对于点多边少的稀疏图来说,采用邻接表 结构使得算法在时间效 率上大大提高。
16
3/12
广度优先搜索(Breadth First Search,简称BFS ) BFS类似于树的层序遍历; 用一个数组用于标志已访问与否,还需要一个工作队列。
【例】一个无向图的BFS
8
6
CD
4
7
HG
BA
邻接多重表(Adjacency Multilist)
9
边表
• 在某些应用中,有时主要考察图中边的权值以及所依附的 两个顶点,即图的结构主要由边来表示,称为边表存储结 构。
• 边表结构采用顺序存储,用2个一维数组构成,一个存储 顶点信息,一个存储边的信息。边数组的每个元素由三部 分组成:
– 边的起点下标 – 边的终点下标 – 边的权值
1
A [i][
j]
0
如果 (vi , v j ) 或 vi , v j G的边 其它
无权图的邻接矩阵表示示例
V1
V2
V0
3
V3
4 12/15
带权图的邻接矩阵的定义
A [i][ j] wij
如果 (vi , vj ) 或 vi , v j G的边 其它
带图权的图邻的接邻矩接阵矩表阵示表示示例示[例例6.9]
1
第一部分 图的定义和术语
2
图的定义
“图” G可以表示为两个集合:G =(V, E)。每条 边是一个顶点对(v, w) E ,并且 v, w V。
通常:用 |V| 表示顶点的数量(|V| ≥ 1), 用 |E| 表示边的数量(|E| ≥ 0)。
(1) 无向图(完全有向图边数与顶点数之间的 关系) (2) 有向图(完全有向图弧数与顶点数之间的 关系) (3) 简单图:没有重边和自回路的图 (4) 邻接 (5) 路径,路径长度 (6) 无环(有向)图:没有任何回路的(有向)图 (7) 度,入度,出度 (8) 无向图的顶点连通、连通图、连通分量 (9) 有向图的顶点强连通,强连通图、连通分量
数据结构流程图

数据结构流程图数据结构是计算机科学中非常重要的概念之一,它用于描述数据元素之间的关系和存储方式。
而流程图则是一种用于表示算法、操作过程或系统设计的图形化工具。
在计算机科学领域中,流程图常用于描述算法和程序设计过程。
本文将探讨数据结构流程图的相关概念和使用方法。
一、概述数据结构流程图是一种使用标准符号和连线来表示数据结构及其操作的图形化工具。
它包括了各种数据结构的表示方法和基本操作的实现流程。
通过使用数据结构流程图,人们可以清晰地了解数据元素之间的关系以及各种操作的执行过程。
二、符号表示数据结构流程图使用了一系列标准化的符号来表示不同类型的数据结构和操作。
下面是几种常用的符号表示:1. 开始/结束符号:用于表示程序的开始和结束点,通常使用圆角矩形来表示。
2. 输入/输出符号:用于表示输入或输出操作,通常使用矩形或平行四边形来表示。
3. 过程符号:用于表示具体的执行过程,通常使用矩形来表示。
4. 判断符号:用于表示条件分支和判断操作,通常使用菱形来表示。
5. 箭头线:用于表示不同符号之间的流向,表示数据或控制信息的传输方向。
三、使用方法数据结构流程图的使用方法可以分为以下几个步骤:1. 定义数据结构:根据实际需求,确定所需的数据结构类型,例如数组、链表、栈、队列等。
2. 设计算法流程:根据数据结构的特点和需求,设计相应的算法流程,包括数据的插入、删除、查找等操作。
3. 表示数据结构:使用符号表示数据结构及其属性,例如使用方框表示数组,使用箭头表示指针等。
4. 表示算法流程:使用符号表示算法流程,包括条件判断、循环操作、数据的移动等。
5. 绘制流程图:根据之前的设计,将数据结构和算法流程以符号形式绘制在图形界面上,使用箭头线表示数据流向。
6. 调试和改进:通过对流程图的分析和调试,发现问题并进行改进,保证算法的正确性和高效性。
四、实例演示以下是一个使用数据结构流程图描述数组插入操作的示例:思路:1. 输入待插入的元素和插入位置;2. 检查插入位置是否合法;3. 如果合法,将插入位置后的元素依次向后移动一个位置;4. 将待插入的元素放入插入位置处;5. 输出修改后的数组。
数据结构-图及其存储结构

for (j=0;j<G.vexnum;+ +j ) adj Info G.arcs[i][j]={∞,NULL}; //Arccell的形式为: for (k=0;k<G.arcnum;+ +i ) { //二维数组存放各边上的信息 scanf(v1,v2,w); i=locatevex(G,v1); j=locatevex(G,v2); //求顶点v1,v2在图中的位置 G.arcs[i][j].adj=w; G.arcs[j][i].adj=w; //无向网的邻接矩阵是对称的 if (IncInfo) Input (*G.arcs[i][j].info); //将弧上的信息存储在指针info
case UDN: return CreateUDN(G);
default : return ERROR; }//CreateGraph
二、存储结构
2.数组表示法前提下图的输入
*以无向网为例,即当用户输入图的类型标志为UDN时,有:
Status CreateUDN(MGraph &G){ scanf(G.vexnum,G.arcnum,IncInfo); //IncInfo 为0时表示各弧
v2 6 5
v1 5 1 5 v3 3 6 4 2 v4
一个连通无向图的生成树是该图的一个连通分量,它 包含有该图的所有n个顶点以及连接这n个顶点的(n-1) 条边。 边或弧上带权值的图称为带权图或网(分为无向网和 有向网)。 一个无向图的所有生成树中,边上的权值之和最小的 生成树称为该图的最小生成树或最小代价生成树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ p = G.vertices[j].firstarc; q = p->nextarc; if(p->adjvex == i) { G.vertices[j].firstarc = q; p = q; q = q->nextarc; continue; } else if(p->adjvex > i) p->adjvex--; while(q != NULL) { if(q->adjvex == i) { p->nextarc = q->nextarc; free(q); q = p->nextarc; } else if(q->adjvex > i) q->adjvex--; else { p = p->nextarc; q = q->nextarc; } } } else if( (G.vertices[j].firstarc->nextarc (G.vertices[j].firstarc != NULL) ) if( G.vertices[j].firstarc->adjvex == i ) { G.vertices[j].firstarc = NULL; } } } == NULL) &&
1. 实验目的 通过上机实验进一步掌握图的存储结构及基本操作的实现。 2. 实验内容与要求 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。 3. 数据结构设计 逻辑结构:图状结构 存储结构:顺序存储结构、链式存储结构 4. 算法设计
printf("第%d个\n",i+1); scanf("%s",&G.vertices[i]); G.vertices[i].firstarc = NULL; } //这里开始构造边 printf("请输入边的信息\n"); printf("例如:v1 v2\n"); for(i = 0 ; i < G.arcnum ; i++) { printf("第%d条边\n",i+1); scanf("%s %s",&node1,&node2); j = LocateVex(G,node1); k = LocateVex(G,node2); p = (ArcNode *)malloc(sizeof(ArcNode)); q = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = k; q->adjvex = j; p->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p; q->nextarc = G.vertices[k].firstarc; G.vertices[k].firstarc = q; } PrintUDG(G); return 1; } int DeleteUDG(ALGraph &G) { int i,j; ArcNode *p,*q; char node[2]; int LocateVex(ALGraph G,char node[2]); void PrintUDG(ALGraph G); if(G.arcnum == 0) { printf("请先生成图\n");
return 0; } printf("请输入要删除的节点\n"); scanf("%s",&node); i = LocateVex(G,node); if(i == -1) { printf("无此节点\n"); return 0; } else { G.vexnum--; if((p = q = G.vertices[i].firstarc) != NULL) { G.arcnum--; p = p->nextarc; G.vertices[i].firstarc = p; free(q); q = p; while(p != NULL) { G.arcnum--; p = p->nextarc; G.vertices[i].firstarc = p; free(q); q = p; } } for(j = 0 ; j < G.vexnum ; j++ ) { if(j >= i) { strcpy(G.vertices[j].data , G.vertices[j+1].data); G.vertices[j].firstarc = G.vertices[j+1].firstarc; } if(G.vertices[j].firstarc->nextarc != NULL)
int t; t=q.data[q.front]; q.front++; return(t); } int empty() { if(q.front==q.rear) return 1; return 0; } int LocateVex(ALGraph G,char node[2]) { int i; for(i = 0 ; i < G.vexnum ; i++) { if(strcmp(G.vertices[i].data,node)==0) return i; } return -1; } int CreateUDG(ALGraph &G) { int LocateVex(ALGraph G,char node[2]); void PrintUDG(ALGraph G); int i,j,k; char node1[2],node2[2]; ArcNode *p,*q; printf("请输入顶点数和弧数\n"); printf("例如:5,6\n"); scanf("%d,%d",&G.vexnum,&G.arcnum); printf("请输入各顶点\n"); for(i = 0 ; i < G.vexnum ; i++) {
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_VERTEX_NUM 20 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode { char data[2]; //顶点就设置和书上V1等等一样吧 ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; }ALGraph; typedef struct { int data[MAX_VERTEX_NUM+10]; int front; int rear; }queue; int visited[MAX_VERTEX_NUM]; queue q; int main() { ALGraph G; int CreateUDG(ALGraph &G); int DeleteUDG(ALGraph &G); int InsertUDG(ALGraph &G); void BFSTraverse(ALGraph G, int (*Visit)(ALGraph G,ArcNode v)); int PrintElement(ALGraph G,ArcNode v);
Hale Waihona Puke p->adjvex = k; q->adjvex = l; p->nextarc = G.vertices[l].firstarc; G.vertices[l].firstarc = p; q->nextarc = G.vertices[k].firstarc; G.vertices[k].firstarc = q; } PrintUDG(G); return 1; } void depthfirstsearch(ALGraph *g,int vi) { ArcNode *rear; printf("%s\t",g->vertices[vi].data); visited[vi]=1; rear=g->vertices[vi].firstarc; while((rear!=NULL)&&(!visited[rear->adjvex])) { depthfirstsearch(g,rear->adjvex); rear=rear->nextarc; } } void travel(ALGraph *g) { int v; for(v=0;v<g->vexnum;v++) if(!visited[v]) depthfirstsearch(g,v); } void breadfirstsearch(ALGraph *g) { int v,t,i; ArcNode *rear; for(i = 0 ; i <g->vexnum ; i++) visited[i] = 0; for(v=0;v<g->vexnum;v++) {
void menu(); void depthfirstsearch(ALGraph *g,int vi); void travel(ALGraph *g); void breadfirstsearch(ALGraph *g); int i; G.arcnum = G.vexnum = 0; while(1) { menu(); do { printf ( "请输入要进行的操作\n" ); scanf ("%d",&i); if (i<1||i>6) printf("错误数字,请重新输入\n"); }while (i<1||i>6); switch (i) { case 1: CreateUDG(G); system("pause"); system("cls"); break; case 2: DeleteUDG(G); system("pause"); system("cls"); break; case 3: InsertUDG(G); system("pause"); system("cls"); break; case 4: travel(&G); system("pause"); system("cls"); break; case 5: breadfirstsearch(&G); system("pause"); system("cls"); break; case 6: exit(0); break; } } return 1; } void enterqueue(int v) { q.data[q.rear]=v; q.rear++; } int deletequeue() {