邻接表表示的带权有向图(网)
计算机专业基础综合数据结构(图)历年真题试卷汇编4

计算机专业基础综合数据结构(图)历年真题试卷汇编4(总分:58.00,做题时间:90分钟)一、综合题(总题数:7,分数:14.00)1.已知一图如下图所示:(1)写出全部拓扑排序;(2)以V1为源点,以V8为终点,给出所有事件允许发生的最早时间和最晚时间,并给出关键路径;(3)求V1结点到各点的最短距离。
【北京邮电大学2000五(15分)】__________________________________________________________________________________________正确答案:(正确答案:关键路径有3条,长17。
各事件允许发生的最早时间和最晚时间略。
V1→V2→V6→V8,V1→V3→V5→V7→V8,V1→V7→V8→V1→V4→V5→V8 (3)V1结点到其他各结点的最短距离为:2,3,6,12,10,15,16。
)2.(1)对于有向无环图,叙述求拓扑有序序列的步骤;(2)对于以下的图,写出它的四个不同的拓扑有序序列。
【南开大学1998二(12分)】__________________________________________________________________________________________ 正确答案:(正确答案:(1)对有向图,求拓扑序列步骤为: 1)在有向图中选一个没有前驱(即入度为零)的顶点并输出。
2)在图中删除该顶点及所有以它为尾的弧。
3)重复1)和2),直至全部顶点输出,这时拓扑排序完成;否则,图中存在环,拓扑排序失败。
(2)这里使用形式化描述方法,当有多个顶点可以输出时,将其按序从上往下排列,这样不会丢掉拓扑序列。
这里只画出从顶点1开始的所有可能的拓扑序列,从顶点3开始的拓扑序列可类似画出。
)3.有向图的拓扑排序能否用图的深度搜索模式来查找?若能,请简述方法;若不能,请简述原因。
【西北大学2000二、8(5分)】__________________________________________________________________________________________ 正确答案:(正确答案:图的深度优先遍历可用于拓扑排序。
计算机学科专业基础综合数据结构-图(二)_真题-无答案

计算机学科专业基础综合数据结构-图(二)(总分100,考试时间90分钟)一、单项选择题(下列每题给出的4个选项中,只有一个最符合试题要求)1. 具有6个顶点的无向图至少应有______条边才能确保是一个连通图。
A.5 B.6 C.7 D.82. 设G是一个非连通无向图,有15条边,则该图至少有______个顶点。
A.5 B.6 C.7 D.83. 下列关于无向连通图特性的叙述中,正确的是______。
①所有顶点的度之和为偶数②边数大于顶点个数减1③至少有一个顶点的度为1A.只有① B.只有② C.①和② D.①和③4. 对于具有n(n>1)个顶点的强连通图,其有向边的条数至少是______。
A.n+1B.nC.n-1D.n-25. 下列有关图的说法中正确的是______。
A.在图结构中,顶点不可以没有任何前驱和后继 B.具有n个顶点的无向图最多有n(n-1)条边,最少有n-1条边 C.在无向图中,边的条数是结点度数之和 D.在有向图中,各顶点的入度之和等于各顶点的出度之和6. 对于一个具有n个顶点和e条边的无向图,若采用邻接矩阵表示,则该矩阵大小是______,矩阵中非零元素的个数是2e。
A.n B.(n-1)2 C.n-1 D.n27. 无向图的邻接矩阵是一个______。
A.对称矩阵 B.零矩阵 C.上三角矩阵 D.对角矩阵8. 从邻接矩阵可知,该图共有______个顶点。
如果是有向图,该图共有4条有向边;如果是无向图,则共有2条边。
A.9 B.3 C.6 D.1 E.5 F.4 G.2 H.09. 下列说法中正确的是______。
A.一个图的邻接矩阵表示是唯一的,邻接表表示也唯一 B.一个图的邻接矩阵表示是唯一的,邻接表表示不唯一 C.一个图的邻接矩阵表示不唯一,邻接表表示唯一 D.一个图的邻接矩阵表示不唯一,邻接表表示也不唯一10. 用邻接表存储图所用的空间大小______。
A.与图的顶点数和边数都有关 B.只与图的边数有关 C.只与图的顶点数有关 D.与边数的二次方有关11. 采用邻接表存储的图的深度优先搜索算法类似于二叉树的______,广度优先搜索算法类似于二叉树的层次序遍历。
算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课程设计报告系(院):计算机科学学院专业班级:教技1001姓名:李##学号: ******### 指导教师:***设计时间:2012.6.16 - 2012.6.24设计地点:4号楼2号机房目录一、设计方案 (1)二、实现过程以及代码 (2)三、测试 (20)四、结论和分析 (23)五、难点和收获 (23)一、 设计方案1.程序设计基本过程:拿到课程设计任务书,按照要求,需要设计有向图、有向网、无向图 、无向网四种图,以及邻接矩阵、邻接表两种数据存储结构,三层以上的显示菜单。
图的操作中又包含了有关线性表、栈和队列的基本操作。
由于显示菜单已给出,剩下的任务就是把函数写入其中。
2.程序流程图:预定义 定义结构体 定义变量 各种函数3.程序设计的原理:图的操作都是以两种存储结构为基础的:邻接矩阵存储结构和邻接表存储结构,如有向图,有向网,无向图,无向网的创建,其他的操作都是在四种图创建后才开始进行的。
所以,首先必须理解两种存储结构的定义。
图的邻接矩阵存储结构即图的数组表示法。
用两个数组分别存储数据元素(如顶点)的信息和数据元素之间的关系(如边或弧)的信息。
用邻接矩阵存储结构的图具有以下几点特征:(一):顶点数:vexnum ,边(弧)数:arcnum ,图的种类:kind ;(二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info);(三):顶点向量(顶点名):vexs[];其优点是以二维数组表示有n 个顶点的图时,需存放n 个顶点的信息和n*n 条弧的信息存储量。
借助邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求出各个顶点的度。
缺点是时间复杂度是O (n*n ),例如,构造一个具有n 个顶点和e 条边的无向网的时间复杂度为O (n*n+e*n )。
图的邻接表存储结构是图的一种链式存储结构。
对图中的每个顶点建立一个单链表,每个结点由三个域组成,邻接点域adjvex (弧尾在邻接表链表中的位序),链域nextarc (下一条弧),数据域info(权值)。
最短路问题(整理版)

最短路问题(short-path problem)若网络中的每条边都有一个权值值(长度、成本、时间等),则找出两节点(通常是源节点与结束点)之间总权和最小的路径就是最短路问题。
最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。
最短路问题,我们通常归属为三类:单源最短路径问题(确定起点或确定终点的最短路径问题)、确定起点终点的最短路径问题(两节点之间的最短路径)1、Dijkstra算法:用邻接矩阵a表示带权有向图,d为从v0出发到图上其余各顶点可能达到的最短路径长度值,以v0为起点做一次dijkstra,便可以求出从结点v0到其他结点的最短路径长度代码:procedure dijkstra(v0:longint);//v0为起点做一次dijkstrabegin//a数组是邻接矩阵,a[i,j]表示i到j的距离,无边就为maxlongintfor i:=1 to n do d[i]:=a[v0,i];//初始化d数组(用于记录从v0到结点i的最短路径), fillchar(visit,sizeof(visit),false);//每个结点都未被连接到路径里visit[v0]:=true;//已经连接v0结点for i:=1 to n-1 do//剩下n-1个节点未加入路径里;beginmin:=maxlongint;//初始化minfor j:=1 to n do//找从v0开始到目前为止,哪个结点作为下一个连接起点(*可优化) if (not visit[j]) and (min>d[j]) then//结点k要未被连接进去且最小begin min:=d[j];k:=j;end;visit[k]:=true;//连接进去for j:=1 to n do//刷新数组d,通过k来更新到达未连接进去的节点最小值,if (not visit[j]) and (d[j]>d[k]+a[k,j]) then d[j]:=a[k,j]+d[k];end;writeln(d[n]);//结点v0到结点n的最短路。
图的邻接表表示法

图的邻接表表示法图的邻接表表示法类似于树的孩子链表表示法。
对于图G中的每个顶点v i,该方法把所有邻接于v i的顶点v j链成一个带头结点的单链表,这个单链表就称为顶点v i的邻接表(Adjacency List)。
1.邻接表的结点结构(1:① 邻接点域adjvex存放与vi相邻接的顶点v j的序号j。
② 链域next将邻接表的所有表结点链在一起。
注意:若要表示边上的信息(如权值),则在表结点中还应增加一个数据域。
顶点v i邻接表的头结点包含两个域:① 顶点域vertex存放顶点v i的信息② 指针域firstedgev i的邻接表的头指针。
注意:① 为了便于随机访问任一顶点的邻接表,将所有头结点顺序存储在一个向量中就构成了图的邻接表表示。
② 有时希望增加对图的顶点数及边数等属性的描述,可将邻接表和这些属性放在一起来描述图的存储结构。
2.无向图的邻接表对于无向图,v i的邻接表中每个表结点都对应于与v i相关联的一条边。
因此,将邻接表的表头向量称为顶点表。
将无向图的邻接表称为边表。
【例】对于无向图G5,其邻接表表示如下面所示,其中顶点v0的边表上三个表结点中的顶点序号分别为1、2和3,它们分别表示关联于v0的三条边(v0,v1),(v0,v2)和(v0,v3)。
注意:n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和2e个边表结点。
3.有向图的邻接表对于有向图,v i的邻接表中每个表结点都对应于以v i为始点射出的一条边。
因此,将有向图的邻接表称为出边表。
【例】有向图G6的邻接表表示如下面(a)图所示,其中顶点v1的邻接表上两个表结点中的顶点序号分别为0和4,它们分别表示从v1射出的两条边(简称为v1的出边):<v1,v0>和<v1,v4>。
注意:n个顶点e条边的有向图,它的邻接表表示中有n个顶点表结点和e个边表结点。
4.有向图的逆邻接表在有向图中,为图中每个顶点v i建立一个入边表的方法称逆邻接表表示法。
[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9.doc
![[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9.doc](https://img.taocdn.com/s3/m/c98b4e8d5fbfc77da269b1b5.png)
[考研类试卷]计算机专业基础综合数据结构(图)历年真题试卷汇编9 一、综合题1 下面的邻接表表示一个给定的无向图。
(1)给出从顶点v1开始,对图G用深度优先搜索法进行遍历时的顶点序列;(2)给出从顶v1,1开始,对图G用广度优先搜索法进行遍历时的顶点序列。
【复旦大学1998六(10分)】1 给出图G:2 画出G的邻接表表示图;3 根据你画出的邻接表,以顶点①为根,画出G的深度优先生成树和广度优先生成树。
【南开大学1997五(14分)】【烟台大学2007四、3(15分)】4 已知一个有向图如图所示,则从顶点a出发进行深度优先遍历,写出所有可能得到的DFS序列。
【北京交通大学2006四、4(5分)】4 解答下面的问题:【西安电子科技大学2000计算机应用六(10分)】5 如果每个指针需要4字节,每个顶点的标号占2字节,每条边的权值占2字节。
下图采用哪种表示法所需的空间较多?为什么?6 写出下图从顶点1开始的:DFS树。
7 如下所示的连通图,请画出:(1)以顶点①为根的深度优先生成树;(5分)(2)如果有关节顶点,请找出所有的关节顶点。
(5分)【清华大学l 998七(10分)】7 某田径赛中各选手的参赛项目表如下:设项目A,B,…,F各表示一数据元素,若两项目不能同时举行,则将其连线(约束条件)。
8 根据此表及约束条件画出相应的图状结构模型,并画出此图的邻接表结构;9 写出从元素A出发按“广度优先搜索”算法遍历此图的元素序列。
【北京科技大学1999五2000五(12分)】10 考虑下图:(1)从顶点A出发,求它的深度优先生成树。
(2)从顶点E出发,求它的广度优先生成树。
(3)根据普利姆(Prim)算法,求它的最小生成树。
【上海交通大学1999六(12分)】11 在什么情况下,Prim算法与Kruskual算法生成不同的MST?【西安电子科技大学2000计算机应用一、11(5分)】12 已知一个无向图如下图所示,要求分别用Prim和Kruskal算法生成最小生成树(假设以①为起点,试画出构造过程)。
邻接表表示图的各结点的度数(无向图)出度(有向图)

邻接表表⽰图的各结点的度数(⽆向图)出度(有向图)#include<iostream>#include<string.h>using namespace std;#define MAX_VERTEX_NUM 50 //定义最⼤的结点数typedef enum{DG,UDG}GraphKind; //定义图的种类DG(有向图) UDG(⽆向图)typedef char VertexData; //定义结点信息的数据类型//定义弧结点typedef struct EdgeNode{int adjvex; //该弧指向顶点的位置VertexData data;EdgeNode *next;}EdgeNode;//定义表头结点typedef struct VetexNode{VertexData data;EdgeNode *link;}VetexNode;//定义基于邻接表的图typedef struct AdjList{int vexNun,arcNun; //定义邻接表的顶点数,弧数VetexNode vertex[MAX_VERTEX_NUM];GraphKind kind;}AdjList;// 创建图,输⼊信息包括(图的定点数,边数,图的种类,及每条边的起始,结束位置)void CreateGraph(AdjList *adj,int *n){int e,s,d;char str;cout<<"输⼊顶点数(n)和边数(e)\n";cin>>*n>>e;adj->arcNun=*n;adj->vexNun=e;cout<<"选择图的类型有向图(D)⽆向图(U)\n";cin>>str;//判断图的类型switch(str){case 'D': adj->kind=DG;break;case 'U': adj->kind=UDG;break;default :cout<<"没有此类型的图\n";break;}EdgeNode *q=NULL;//初始化n个表头结点for(int i=1;i<=*n;i++){cout<<"输⼊第"<<i<<"个结点的信息\n";cin>>adj->vertex[i].data;adj->vertex[i].link=NULL;}for(i=1;i<=e;i++){cout<<"请输⼊边的起始与⽬的位置\n";cin>>s>>d;cout<<"请输⼊⽬的结点的信息\n";q=(EdgeNode *)malloc(sizeof(EdgeNode));if(q==NULL) return;q->adjvex=d;cin>>q->data;q->next=adj->vertex[s].link;adj->vertex[s].link=q;}}//显⽰图的每条边void DispGraph(AdjList *adj){int n=adj->arcNun;cout<<"所有的边为:\n";EdgeNode *q=NULL;for(int i=1;i<=n;i++){q=adj->vertex[i].link;if(q==NULL){cout<<"没有从"<<adj->vertex[i].data<<"出发的结点\n";}else{cout<<"从结点"<<adj->vertex[i].data<<"出发的"<<"边是\n";while(q!=NULL){cout<<adj->vertex[i].data<<"->"<<q->data<<"\n";q=q->next;}}}}//如果是有向图求得每个结点的出度,⽆向图求得每个结点的度数void GetNodeDu(AdjList *adj){int countDu;EdgeNode *q=NULL;for(int i=1;i<=adj->arcNun;i++){countDu=0;q=adj->vertex[i].link;while(q!=NULL){countDu++;q=q->next;}if(adj->kind==DG)cout<<"结点"<<adj->vertex[i].data<<"的出度为"<<countDu<<"\n";else if(adj->kind==UDG)cout<<"结点"<<adj->vertex[i].data<<"的度数为"<<countDu<<"\n";}}int main(){int n;AdjList * adj=(AdjList *)malloc(sizeof(AdjList));CreateGraph(adj,&n);DispGraph(adj);GetNodeDu(adj);return 0;}转⾃/jaychang_z/blog/item/b6f3e5d8e3a08b2411df9bc4.html。
习题答案 (1)分析

1.已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为()。
A.-A+B*C/DE B.-A+B*CD/E C.-+*ABC/DE D.-+A*BC/DE参考答案:D3.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250 B.500 C.254 D.505 E.以上答案都不对参考答案:E8.在一棵三元树中度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为()个。
A.4 B.5 C.6D.7参考答案:C10.具有10个叶结点的二叉树中有()个度为2的结点。
A.8 B.9C.10 D.11参考答案:B53.由3个结点可以构造出()种不同的二叉树。
A.2 B.3 C.4 D.5参考答案:D47.引入二叉线索树的目的是()。
A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除C.为了能方便的找到双亲D.使二叉树的遍历结果唯一19.将如下由三棵树组成的森林转换为二叉树。
参考答案:HGDACJIBFEMPONKOL反过来,将一个二叉树转化成森林或树?(注意:转化成森林的结果和转化成树的结果不一样)21.设某二叉树的前序遍历序列为ABCDEFGGI ,中序遍历序列为BCAEDGHFI ,试画出该二叉树。
参考答案:27.设二叉树T 的存储结构如下:1 2 3 4 5 6 7 8 9 10Lchild 0 0 2 3 7 5 8 0 10 1 Data JH F D B A C E G I Rchild0 094其中Lchild 、Rchild 分别为结点的左、右孩子指针域,Data 为结点的数据域,若根指针T 的值为6,试:(1)画出二叉树的逻辑结构;(2)写出按前序、中序、后序遍历该二叉树所得到的结点序列;(3)画出二叉树的后序线索树。
参考答案:前序序列:ABCEDFHGIJ 中序序列:ECBHFDJIGA 后序序列:ECHFJIGDBA31.假定用于通讯的电文仅有8个字母C1,C2,…,C8组成,各个字母在电文中出现的频率分别为5,25,3,6,10,11,36,4,试为这8个字母设计哈夫曼编码树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
===实习报告一“邻接表表示的带权有向图(网)”演示程序===(一)、程序的功能和特点1. 程序功能:建立有向图的带权邻接表,能够对建立的邻接表进行添加顶点,添加边和删除顶点,删除边的操作,并能显示输出邻接表。
2. 程序特点:采用java面向对象语言,对边,顶点和邻接表用类进行封装。
采用链式存储结构。
(二八程序的算法设计算法一:“插入一个顶点”算法:1. 【逻辑结构与存储结构设计】逻辑结构:线性结构。
存储结构:顺序存储与链式存储结合。
邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。
邻接表表示法类似于树的孩子链表表示法。
就是对于图G中的每个顶点vi,将所有邻接于vi的顶点vj链成一个单链表,这个单链表就称为顶点vi的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。
如下图就是一个临界表的存储图。
vertex firstedgeadjvex n ext序号vertex firstedge图的邻接表表示在邻接表表示中有两种结点结构,如图所示。
邻接矩阵表示的结点结构顶点域边指针流程示意图:顶点数据组成的数组顶点数组表的顺序存储: V0 V1— V2—O2.【基本操作设计】文字说明: (1) .首先判断顶点表是否满。
(2) .若满则插入失败,放回false 。
(3) .顶点表若不满,创建新顶点,将新顶点加入顶点表 (4) .插入顶点成功,返回true 。
添加顶点前状态添加顶点v2后 网图的边表结构//插入一个顶点public boolea n In sertVertex ( char vertex ){ if (NumVertices==MaxVertices ) return false ; // 顶点表满Vertex t= n ewVertex();t. data =vertex;t. adj =null ;NodeTable[ NumVertices ]=t;NumVertices++;//注明:企图以下赋值不合Java 语法〃NodeTable[NumVertices].data=vertex;〃NodeTable[NumVertices].adj=null; return true ;}算法二:“插入一条边”算法:1. 【逻辑结构与存储结构设计】逻辑结构:线性结构。
存储结构:链式存储结构网图的边表结构如图所示。
邻接点域4.【高级语言代码】2. 【基本操作设计】基本操作:3. 【算法设计】文字说明:(1).首先判断插入边上的两个顶点编号是否越界。
if (v1>= NumVertices ||v1<0) return false ;if (v2>= NumVertices ||v2<0) return false ;(2).如果越界则插入失败,返回false。
(3).否则创建新边结点,以v2顶点和该边上的权创建新边结点(4).再将新创建的边结点连接到v1顶点的单链表后面。
(5).插入成功返回true。
4. 【高级语言代码】//插入一条边public boolean InsertEdge ( int v1, int v2, double weight ){ if (v1>= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0) return false ;//生成一个边结点,并赋值Edge E=n ewEdge(v2,weight);//链接在以v1为起点的单链表的最后Edge p=NodeTable[v1]. adj;//插入第一个边结点if ( p== null ) NodeTable[v1]. adj =E; else { //插入其它边结点while (p. link !=null ) p=p. link ;p. link =E;}NumEdges+; //当前顶点数return true ;} return true ;}(三八程序中类的设计“ Edge” 类:1. I逻辑结构与存储结构】逻辑结构:线性结构。
存储结构:链式存储结构在邻接表表示中边结点结构,如图所示。
边表邻接矩阵表示的边的结构2. 【主要成员变量说明】主要成员变量有:int dest;表示邻接点下标。
double cost ;表示边上的权值Edge link ; 表示下一边链接指针3. 【主要成员方法说明】lin k(i nt iD,double fD) 为结点类有两个参数的构造函数void lin kDisplay() 显示结点自身的数据域。
4. 【高级语言代码】//边结点类class Edge {int dest; //邻接点下标double cost; //边上的权值//下一边链接指针Edge link ;//构造函数:生成边结点Edge ( int D, double C ){dest =D;cost =C; link =null ;}};“ Vertex ”类:1. I逻辑结构与存储结构】逻辑结构:线性结构。
存储结构:链式存储结构在邻接表表示中顶点结构,如图所示。
2. 【主要成员变量说明】主要成员变量为:char data;顶点的数据域。
Edge adj ;边链表头指针。
3. 【主要成员方法说明】该类有默认的构造方法。
4. 【高级语言代码】//顶点类class Vertex {char data ; //顶点数据Edge adj; //边链表头指针};“ GraphAdj ” 类:4.【逻辑结构与存储结构】逻辑结构:线性结构。
存储结构:顺序存储与链式存储结合邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。
序号vertex firstedge图的邻接表表示5. 【主要成员变量说明】主要成员变量为:static int DefaultSize = 20; 静态缺省数据大小。
private Vertex NodeTable[]; 顶点表数组。
private int NumVertices ; 当前顶点个数。
private int MaxVertices ; 最大顶点个数。
private int NumEdge;s 当前边数。
6. 【主要成员方法说明】public GraphAdj ( int vn, char v[], int en, int e[][], double w[]) :为定义的构造函数,建立图的邻接表。
public boolean GraphEmpty ( ) :判断图是否为空。
public boolean GraphFull ( ) :判断图是否为满。
public char GetValue ( int i ) :按顶点序号返回顶点数据。
public int NumberOfVertices ( ) :返回图的顶点数。
public int NumberOfEdges ( ) :返回图的边数。
public boolean InsertVertex ( char vertex ) :插入一个顶点。
public boolean RemoveVertex ( int v ) :删除一个顶点。
public boolean InsertEdge ( int v1, int v2, double weight ) :插入一条边。
public boolean RemoveEdge ( int v1, int v2 ) :删除一条边。
public void display() :显示邻接表。
4. 【高级语言代码】// 定义邻接表类class GraphAdj {static int DefaultSize = 20;private Vertex NodeTable[]; // 顶点表private int NumVertices ; // 当前顶点个数private int MaxVertices ; // 最大顶点个数private int NumEdge;s // 当前边数// 构造函建立图的邻接表public GraphAdj ( int vn, char v[], int en,int e[][], double w[]){// 形参:顶点数顶点数组边数边结点数组权数组int i;NumVertices =0; // 当前顶点数NumEdge=s0; // 当前边数// 确定顶点表空间MaxVertices =vn>DefaultSize ?vn: DefaultSize ;NodeTable = // 创建顶点表newVertex[ MaxVertices ];// 输入顶点for ( i = 0; i < vn; i++)InsertVertex ( v[i]);//输入边。
e为en行2列的数组e[en][2]for ( i = 0; i < en; i++)In sertEdge ( e[i][0], e[i][1], w[i]);}public boolean GraphEmpty ( ){ // 图空否?retur n NumVertices == 0;}public boolean GraphFull ( ){ // 图满否?return NumVertices == MaxVertices ;}//按顶点序号返回顶点数据public char GetValue ( int i ){return i >= 0 && i < NumVertices ? NodeTable[i]. data :'';}//返回图的顶点数public int NumberOfVertices ( ){return NumVertices;}//返回图的边数public int NumberOfEdges ( ){retur n NumEdges}//插入一个顶点public boolea n In sertVertex ( char vertex ){ if (NumVertices ==MaxVertices ) return false ; // 顶点表满Vertex t= n ewVertex();t. data =vertex;t. adj =null ;NodeTable[ NumVertices ]=t;NumVertices++;//注明:企图以下赋值不合Java语法//NodeTable[NumVertices].data=vertex;//NodeTable[NumVertices].adj=null;return true ;}//删除一个顶点public boolean RemoveVertex ( int v ){//当前顶点数NumVerticesif (v>= NumVertices ||v<0)return false ;//删除边链表NodeTable[v]. adj =null ;for (int k=0;k< NumVertices ;k++){//如果有指向V的边,则需删除Edge p=NodeTable[k]. adj ;Edge q=p;while (p!= null ) {if (p. dest ==v){if (q==p) //删第一个边结点NodeTable[k]. adj =p. link ;else //删后面的边结点q. link =p. link ;} q=p;p=p. link ;}}//从顶点表中删除for (int i=v+1;i< NumVertices ;i++)NodeTable[i-1]= NodeTable[i];NumVertices--;for (int j=0;j< NumVertices-1;j++){//如果有以V以后的点为终点的点,贝UEdge p=NodeTable[j]. adj ;//邻接表中的dest属性应减1if (p!= null ){//防止在添加顶点之后由于NumVertices加1//而导致空指针异常if (p. dest >v){p. dest =p. dest-1;}while (p. link !=null ){ p=p. link ;if (p. dest >v){p. dest =p. dest-1;}}}} //结束循环for jreturn true ;}//插入一条边public boolean InsertEdge ( int v1, int v2, double weight ){ if (v1>= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0) return false ;//生成一个边结点,并赋值Edge E=n ewEdge(v2,weight);//链接在以v1为起点的单链表的最后Edge p=NodeTable[v 1 ]. adj ;// 插入第一个边结点if ( p== null ) NodeTable[v1]. adj =E;else { // 插入其它边结点while (p. link != null ) p=p. link ;p. link =E;}NumEdge+s+; // 当前顶点数return true ;}// 删除一条边public boolean RemoveEdge ( int v1, int v2 ){if (v 1 >= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0)return false ;//从第v1条单链表向后查找Edge p=NodeTable[v 1 ]. adj ;Edge q=p;while (p!= null ) {if (p. dest ==v2){if (q==p) // 删第一个边结点NodeTable[v1]. adj =p. link ;else // 删后面的边结点q. link =p. link ; return true ;}q=p;p=p. link ;}return false ;}// 显示邻接表public void display(){Edge p;System. out .println( "邻接表");for ( int i = 0; i < NumVertices ; i++ ) {System. out .println( NodeTable[i]. data ); // 顶点p = NodeTable[i]. adj ; // 打印第i 条链表while (p!= null ) { System.out .print(p. dest +" " +p. cost +" " ); p=p. link ;}System. out .println();}// 主函数public static void main(String args[]){// 准备有向图(网)数据char c[]={ 'A' , 'B' ,'C' ,'D' , 'E' , 'F' }; // 顶点int e[][]={ // 弧{0,1},{0,3},{1,2},{2,3},{4,5}, {1,3},{2,4},{3,5},{4,3},{2,5} };double w[]={2.3,3.6,6.5,2.5,1.7,0.8,7.2,9.1,5.2,1.3}; // 权// 实参:顶点数顶点数组边数边结点数组权数组GraphAdjG=newGraphAdj(6,c,10,e,w); // 邻接矩阵G.display( );// 删除顶点//G.RemoveVertex(2);//G.display( );// 删除一条边//G.RemoveEdge(1,2);//G.display( );}} // 邻接表类结束(四)、程序的输入输出和运行结果截屏程序运行结果截屏:。