图的基本操作(邻接表)

合集下载

c++实现图的基本操作的建立及输出

c++实现图的基本操作的建立及输出
for(int i=0;i<G.vexnum;i++)visited[i]=0;
int w;
visited[v]=1; printf("%d%c->",v,G.vertices[v].data);
for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))
if(visited[w]==0) DFS(G,w);
}
void DFSTrave宝箱开启!
淘金行动火热升级,第二波奖品等你来拿!更有财富值及精美徽章等着你哦~勇往直前,意想不到的惊喜等着你!
查看
新闻网页贴吧知道MP3图片视频百科 帮助 | 设置 知道 > 电脑/网络 > 程序设计 > C/C++
最佳答案 两个版本.第一个是我自己做的,带深度遍历 第二个是同学的,比较全.
时间太久了..自己都看不明白了
您自己研究吧
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc;
// 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];
while(TNode->nextarc!=NULL){
printf("->%d",TNode->nextarc->adjvex);

图的基本操作 实验报告

图的基本操作 实验报告

图的基本操作实验报告图的基本操作实验报告引言:图是一种常见的数据结构,广泛应用于计算机科学和其他领域。

本实验报告旨在介绍图的基本操作,包括创建图、添加节点和边、遍历图等,并通过实验验证这些操作的正确性和效率。

实验目的:1. 了解图的基本概念和术语;2. 掌握图的创建和修改操作;3. 熟悉图的遍历算法;4. 分析图的操作的时间复杂度。

实验过程:1. 创建图首先,我们需要创建一个图对象。

图可以用邻接矩阵或邻接表来表示。

在本实验中,我们选择使用邻接表来表示图。

通过遍历输入的节点和边信息,我们可以创建一个包含所有节点和边的图。

2. 添加节点和边在创建图对象后,我们可以通过添加节点和边来构建图的结构。

通过输入节点的标识符和边的起始和结束节点,我们可以在图中添加新的节点和边。

添加节点和边的操作可以通过修改邻接表来实现,将节点和边的信息存储在对应的链表中。

3. 遍历图遍历图是图操作中常用的操作之一。

通过遍历图,我们可以访问图中的所有节点和边。

在本实验中,我们选择使用深度优先搜索(DFS)算法来遍历图。

DFS算法通过递归的方式遍历图中的节点,先访问当前节点,然后再递归地访问与当前节点相邻的节点。

4. 分析时间复杂度在实验过程中,我们记录了图的操作所花费的时间,并分析了它们的时间复杂度。

通过对比不同规模的图的操作时间,我们可以评估图操作的效率和可扩展性。

实验结果:通过实验,我们成功创建了一个图对象,并添加了多个节点和边。

我们还通过DFS算法遍历了图,并记录了遍历的顺序。

实验结果表明,我们的图操作实现正确,并且在不同规模的图上都能够高效地工作。

讨论与结论:本实验报告介绍了图的基本操作,并通过实验验证了这些操作的正确性和效率。

通过实验,我们了解到图是一种重要的数据结构,可以用于解决许多实际问题。

同时,我们还深入分析了图操作的时间复杂度,为后续的图算法设计和优化提供了参考。

总结:通过本次实验,我们对图的基本操作有了更深入的了解。

图的基本操作与应用

图的基本操作与应用

图的基本操作与应用图是一种重要的数据结构,广泛应用于计算机科学和相关领域。

本文将介绍图的基本操作和常见的应用场景,通过详细讲解来帮助读者更好地理解和应用图。

一、图的定义和表示图是由节点(顶点)和边组成的集合。

节点表示实体,边表示节点之间的关系。

图可以用以下方式进行表示:邻接矩阵和邻接表。

1. 邻接矩阵:用二维数组表示图的连接关系,其中数组元素a[i][j]表示节点i到节点j是否存在一条边。

2. 邻接表:使用链表或数组的方式表示节点的连接关系。

每个节点对应一个链表,链表中存储与该节点相连接的其他节点。

二、图的基本操作1. 添加节点:图中可以通过添加节点来增加实体。

添加节点时,需要更新相应的连接关系,即在邻接矩阵或邻接表中添加对应的行或节点。

2. 添加边:向图中添加边可以表示节点之间的关系。

在邻接矩阵中,将对应的元素设置为1。

在邻接表中,将对应的节点添加到该节点的链表中。

3. 删除节点:从图中删除节点时,需要将与该节点相关的边一并删除。

删除节点后,对应的行或链表也需要进行相应的调整。

4. 删除边:删除边可以断开节点之间的关系。

在邻接矩阵中,将对应的元素设置为0。

在邻接表中,删除对应的节点。

三、图的应用场景1. 社交网络分析:图可以用于分析社交网络中的关系,如朋友关系、粉丝关系等。

可以通过图的遍历算法,寻找潜在的朋友或影响力人物。

2. 路径规划:图可以表示地理空间中的路径,如导航系统中的道路网络。

可以使用图的最短路径算法,如Dijkstra算法或A*算法,来计算最优路径。

3. 组织架构图:图可以用于表示组织或公司的架构,帮助人们更好地理解不同部门之间的关系和沟通路径。

4. 网络流量分析:图可以用于分析网络中的流量,如网络路由、数据传输等。

可以通过图的最大流算法,如Ford-Fulkerson算法,来优化网络流量分配和传输效率。

5. 数据库关系图:图可以用于表示数据库中的关系表,帮助人们理解和查询表之间的关系,如主外键关系等。

数据结构试验报告-图的基本操作

数据结构试验报告-图的基本操作

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

计算机中图的名词解释

计算机中图的名词解释

计算机中图的名词解释在计算机领域中,图(Graph)是一种常见的数据结构,用于描述对象之间的关系和相互作用。

图的概念最早由数学家欧拉提出,并且在计算机科学中得到广泛运用。

本文将从图的基本概念和操作开始,逐步介绍计算机中图的相关术语和应用。

1. 图的基本概念图由节点(Node)和边(Edge)组成。

节点表示对象或实体,边表示节点之间的连接关系。

图可以分为有向图(Directed Graph)和无向图(Undirected Graph)。

在有向图中,边具有方向性,表示从一个节点流向另一个节点;而在无向图中,边没有方向性,表示两个节点之间的相互关系。

2. 图的存储方式为了在计算机中表示和处理图,常见的存储方式有邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)。

邻接矩阵是一个二维数组,其中行和列表示节点,矩阵的值表示节点之间是否有边相连。

邻接表则使用链表的形式来表示节点之间的连接关系,每个节点对应一个链表,链表中存储了与该节点相连的其他节点。

3. 图的遍历图的遍历是指沿着图中的路径,依次访问所有节点的过程。

常见的图遍历算法有深度优先搜索(Depth-First Search)和广度优先搜索(Breadth-First Search)。

深度优先搜索先选择一个起始节点,沿着路径一直深入直到无法继续,然后回溯到其他未访问的节点,继续深入;而广度优先搜索则是从起始节点开始,并逐层扩展,逐层访问。

4. 最短路径算法最短路径算法用于计算两个节点之间的最短路径,即路径上边的权值之和最小。

其中,最常用的最短路径算法是狄克斯特拉算法(Dijkstra Algorithm)。

该算法通过逐步更新节点到其他节点的距离,找到起始节点到目标节点的最短路径。

5. 拓扑排序拓扑排序(Topological Sorting)是一种对有向无环图进行排序的算法。

在有向图中,如果节点 A 的边指向节点 B,那么 B 必须在 A 之后才能出现在排序结果中。

图的操作C语言课程设计

图的操作C语言课程设计

图的操作C语言课程设计一、教学目标本课程的教学目标是使学生掌握图的操作的基本概念、原理和方法,能够运用C语言实现图的基本操作,如建立图、查找顶点、边的相关操作等。

通过本课程的学习,使学生具备以下知识目标:1.理解图的基本概念,如顶点、边、度、相邻顶点等。

2.掌握图的存储结构,如邻接矩阵、邻接表等。

3.熟悉图的基本操作,如添加和删除顶点、边,查找顶点、边的相关操作等。

4.能够使用C语言实现图的基本操作。

5.能够运用图的操作解决实际问题,如最短路径问题、最小生成树问题等。

情感态度价值观目标:1.培养学生的团队合作意识,通过实验和项目使学生学会与他人合作解决问题。

2.培养学生的创新思维,鼓励学生尝试新的方法解决问题。

3.培养学生对计算机科学的兴趣,激发学生继续学习计算机科学的热情。

二、教学内容本课程的教学内容主要包括图的基本概念、图的存储结构、图的基本操作以及图的应用。

具体安排如下:1.图的基本概念:介绍图的定义、顶点、边、度等基本概念。

2.图的存储结构:介绍邻接矩阵、邻接表等图的存储方式。

3.图的基本操作:介绍添加和删除顶点、边,查找顶点、边的相关操作等。

4.图的应用:介绍图的应用场景,如最短路径问题、最小生成树问题等。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法、实验法等。

1.讲授法:通过讲解图的基本概念、原理和方法,使学生掌握图的基础知识。

2.讨论法:通过分组讨论,使学生深入理解图的操作和应用。

3.案例分析法:通过分析实际案例,使学生学会运用图的操作解决实际问题。

4.实验法:通过上机实验,使学生动手实现图的操作,巩固所学知识。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《数据结构与算法》3.多媒体资料:PPT课件、教学视频等4.实验设备:计算机、网络等以上教学资源将帮助学生更好地学习图的操作,提高学生的编程能力和解决问题的能力。

图的遍历问题

图的遍历问题

HUNAN UNIVERSITY数据结构实验报告题目:图的遍历问题学生姓名梁天学生学号************专业班级计科1403指导老师夏艳日期2016.05.14背景网络蜘蛛即Web Spider,是一个很形象的名字。

把互联网比喻成一个蜘蛛网,那么Spider 就是在网上爬来爬去的蜘蛛。

网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。

如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

这样看来,网络蜘蛛就是一个爬行程序,一个抓取网页的程序。

在抓取网页的时候,网络蜘蛛一般有两种策略:广度优先和深度优先(如下面这张简单化的网页连接模型图所示,其中A为起点也就是蜘蛛索引的起点)。

深度优先顾名思义就是让网络蜘蛛尽量的在抓取网页时往网页更深层次的挖掘进去讲究的是深度!也泛指: 网络蜘蛛将会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接! 则访问的节点顺序为==> A --> B --> E --> H --> I --> C --> D --> F --> K --> L --> G。

深度爬行的优点是:网络蜘蛛程序在设计的时候相对比较容易些;缺点是每次爬行一层总要向"蜘蛛老家" 数据库访问一下。

问问老总有必要还要爬下一层吗! 爬一层问一次.... 如果一个蜘蛛不管3721不断往下爬很可能迷路更有可能爬到国外的网站去,不仅增加了系统数据的复杂度更是增加的服务器的负担。

广度优先在这里的定义就是层爬行,即一层一层的爬行,按照层的分布与布局去索引处理与抓取网页。

则访问的节点顺序为==> A --> B --> C --> D --> E --> F --> G --> H --> I--> K --> L。

邻接矩阵的基本操作

邻接矩阵的基本操作

邻接矩阵的基本操作
首先,创建邻接矩阵是指根据图的节点和边的信息构建邻接矩阵。

通常情况下,我们可以使用二维数组来表示邻接矩阵,数组的行和列分别对应图中的节点,而数组中的元素则表示节点之间的连接关系。

如果节点i和节点j之间有边相连,则邻接矩阵中第i行第j列的元素为1,否则为0。

其次,查询邻接关系是指根据邻接矩阵来确定图中节点之间的连接关系。

通过访问邻接矩阵中的特定元素,我们可以判断两个节点之间是否存在边相连,从而确定它们的邻接关系。

另外,添加节点和删除节点也是邻接矩阵的基本操作之一。

当需要向图中添加新节点时,我们可以扩展邻接矩阵的行和列,并根据新的节点信息来更新邻接矩阵。

而当需要删除节点时,我们可以删除邻接矩阵中与该节点相关的行和列,同时调整其他节点的索引以保持邻接矩阵的正确性。

除了上述基本操作外,邻接矩阵还可以进行其他操作,如修改边的权重、遍历邻接矩阵以获取特定信息等。

总之,邻接矩阵是一种非常实用的图表示方法,在实际应用中有着广泛的用途。

通过合
理地运用邻接矩阵的基本操作,我们可以对图进行高效地管理和分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

标头.h#include<math.h>#include<io.h>#include<process.h>#include<iostream>#define TRUE 1#define FLASE 0#define OK 1#define ERROR 0#define FALSE 0#define INFINITY INT_MAX//无穷大typedef int status;#define MAX_VERTEX_NUM 20#define MAX_NAME 5#define MAX_INFO 20typedef int VRType;typedef int InfoType;typedef char VertexType[MAX_NAME];enum GraphKind{DG,DN,AG,AN};// 有向图,有向网,无向图,无向图struct ArcNode{int adjvex; //该弧所指向的顶点的位置ArcNode *nextarc;//指向吓下一条弧的指针InfoType *info;//网的权值指针};//表结点typedef struct{VertexType data;//顶点信息ArcNode *firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM]; //头结点struct ALGraph{AdjList vertices;int vexnum,arcnum;//图的当前顶点数和弧数int kind; //图的种类标志};int LocateVex(ALGraph G,VertexType u){//初始条件:图G存在,u和G中顶点有相同的特征//操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回-1int i;for(i=0;i<G.vexnum;++i)if(strcmp(u,G.vertices[i].data)==0)return i;return -1;}status CreateGraph(ALGraph &G){//采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造四种图)int i,j,k;int w;//权值VertexType va ,vb;ArcNode *p;printf("请输入图的类型(有向图:0,有向网:1,无向图:2无向网:3)");scanf("%d",&G.kind);printf("请输入图的顶点数和边数");scanf("%d%d",&G.vexnum,&G.arcnum);printf("请输入%d个顶点的值(<%d个字符):\n",G.vexnum,MAX_NAME);for(i=0;i<G.vexnum;i++)//构造顶点向量{scanf("%s",G.vertices[i].data);G.vertices[i].firstarc=NULL;}if(G.kind==1||G.kind==3)//网printf("请顺序输入每条弧的权值,弧尾和弧头(以空格作为间隔):\n");else//图printf("请顺序输入每条边的弧尾和弧头(以空格作间隔):\n");for(k=0;k<G.arcnum;++k){if(G.kind==1||G.kind==3)//网scanf("%d%s%s",&w,va,vb);elsescanf("%s%s",va,vb);i=LocateVex(G,va);//弧尾j=LocateVex(G,vb);//弧头p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;if(G.kind==1||G.kind==3)//网{p->info=(int*)malloc(sizeof(ArcNode));*(p->info)=w;}elsep->info=NULL;//图p->nextarc=G.vertices[i].firstarc;//插在表头G.vertices[i].firstarc=p;if(G.kind>=2)//无向图或网,产生第二个表结点{p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=i;if(G.kind==3)//无向网{p->info=(int*)malloc(sizeof(int));*(p->info)=w;}elsep->info=NULL;//无向图p->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p;}}return OK;}void DestroyGraph(ALGraph &G){//初始条件:图G存在。

操作结果:销毁图Gint i;ArcNode *p,*q;G.vexnum=0;G.arcnum=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){q=p->nextarc;if(G.kind%2)//网free(p->info);free(p);p=q;}}}VertexType &GetVex(ALGraph G,int v){//初始条件:图G存在,v是G中的某个顶点的序号。

操作结果:返回v的值if(v>=G.vexnum||v<0)exit(ERROR);return G.vertices[v].data;}status PutVex(ALGraph &G,VertexType v,VertexType value) {//初始条件:图G寻在,v是G中的某个顶点,操作结果:对v赋新值value int i;i=LocateVex(G,v);if(i>=1) //V是G得顶点{strcpy(G.vertices[i].data,value);return OK;}return ERROR;}int FirstAdjVex(ALGraph G,VertexType v){//初始条件:图G存在,v是G中的某个顶点//操作结果:返回v中第一个邻接顶点的序号。

若顶点在G中没有邻接顶点//则返回-1ArcNode *p;int v1;v1=LocateVex(G,v);p=G.vertices[v1].firstarc;if(p)return p->adjvex;elsereturn -1;}int NextAdjVex(ALGraph G,VertexType v,VertexType w){//初始条件:图G存在,v是G中某个顶点,w是v得邻接点//操作结果:返回v的(相对于w的)下一个邻接点的序号ArcNode *p;int v1,w1;v1=LocateVex(G,v);w1=LocateVex(G,w);p=G.vertices[v1].firstarc;while(p&&p->adjvex!=w1)p=p->nextarc;if(!p||!p->nextarc)return -1;elsereturn p->nextarc->adjvex;}void InsertVex(ALGraph &G,VertexType v){//初始条件:图G存在,v和图中顶点有相同特征//操作结果:在图G中增添新顶点v(不增添相关的弧)strcpy(G.vertices[G.vexnum].data,v);//构造新的顶点向量G.vertices[G.vexnum].firstarc=NULL;G.vexnum++;}status DeleteVex(ALGraph &G,VertexType v){//初始条件:图G存在,v是G中某个顶点。

操作结果:删除G中顶点v及其相关弧int i,j;ArcNode *p,*q;j=LocateVex(G,v);//j是顶点v的序号if(j<0)//v不是图G中的顶点return ERROR;p=G.vertices[j].firstarc;//删除以v为初读的弧或边while(p){q=p;p=p->nextarc;if(G.kind%2)//网free(q->info);free (q);G.arcnum--;}G.vexnum--;for(i=j;i<G.vexnum;i++)//顶点v后面的顶点前移G.vertices[i]=G.vertices[i+1];for(i=0;i<G.vexnum;i++)//删除以v为入度的弧或边且必要时修改表结点的顶点位置值{p=G.vertices[i].firstarc;while(p){if(p->adjvex==j){if(p==G.vertices[i].firstarc)//待删除的结点是第一个结点{G.vertices[i].firstarc=p->nextarc;if(G.kind%2)//网free(p->info);free(p);p=G.vertices[i].firstarc;if(G.kind<2)//有向G.arcnum--;}else{q->nextarc=p->nextarc;if(G.kind%2)free(p->info);free(p);p=q->nextarc;if(G.kind<2)//有向G.arcnum--;}}else{if(p->adjvex>j)p->adjvex--;//修改表结点的顶点位置值(序号) q=p;p=p->nextarc;}}}return OK;}status InsertArc(ALGraph &G,VertexType v,VertexType w){//初始条件:图G存在。

v和w是G中两个顶点//操作结果:在G中增添<v,w>若G是无向的,Z则还增添对称弧<w,v> ArcNode *p;int w1,i,j;i=LocateVex(G,v);j=LocateVex(G,w);if(i<0||j<0)return ERROR;G.arcnum++;if(G.kind%2)//网{printf("请输入弧(边)%s->%s的权值",v,w);scanf("%d",&w1);}p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;if(G.kind%2)//网{p->info=(int*)malloc(sizeof(int));*(p->info)=w1;}elsep->info=NULL;p->nextarc=G.vertices[i].firstarc;//插在表头G.vertices[i].firstarc=p;if(G.kind>=2)//无向网{p=(ArcNode*)malloc(sizeof(int));p->adjvex=i;if(G.kind==3)//无向网{p->info=(int*)malloc(sizeof(int));*(p->info)=w1;}elsep->info=NULL;p->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p;}return OK;}status DeleteArc(ALGraph &G,VertexType v,VertexType w){//初始条件:图G存在,v和w是G中的两个顶点//操作结果:在G中删除弧<v,w>,若G 是无向的,则还删除对称弧<w,v> ArcNode *p,*q;int i,j;i=LocateVex(G,v);j=LocateVex(G,w);if(i<0||i<0||i==j)return ERROR;p=G.vertices[i].firstarc;//p指向顶点v的第一条弧while(p&&p->adjvex!=j)//p不空且所指之弧不是待删除弧<v,w>{//p指向下一条弧q=p;p=p->nextarc;}if(p&&p->adjvex==j){if(p==G.vertices[i].firstarc)//p所指是第一条弧G.vertices[i].firstarc=p->nextarc;elseq->nextarc=p->nextarc;if(G.kind%2)//网free(p->info);free(p);G.arcnum--;}if(G.kind>=2)//无向我们还要删除对称弧{p=G.vertices[j].firstarc;while (p&&p->adjvex!=i){q=p;p=p->nextarc;}if(p&&p->adjvex==i){if(p==G.vertices[j].firstarc)G.vertices[j].firstarc=p->nextarc;elseq->nextarc=p->nextarc;if(G.kind==3)free(p->info);free (p); // 释放此结点}}return OK;}bool visited[MAX_VERTEX_NUM];//访问标志数组(全局变量)void (*VisitFunc)(char* v);//函数变量(全局变量)void DFS(ALGraph G,int v){//从第v个顶点出发递归地深度优先遍历图G。

相关文档
最新文档