图2——利用邻接表创建有向图
图2——利用邻接表创建有向图
图
假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表。
主要考查对邻接表的理解。图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是创建表头结点,二是创建边表结点构成的边表。
创建表头结点就是根据输入的结点信息,将结点信息直接存入对应的数据域中,并且将该结点的指针域置为NULL。
for(int i=0;i<G->vexnum;i++)
{
cin>>G->vertex[i].data;
G->vertex[i].firstarc=NULL;
}
创建边表就是根据输入的弧信息,创建新结点,将该结点插入到对应的链表中。
for(int k=0;k<G->arcnum;k++)
{
cin>>v1>>v2;
i=LocateVertex(*G,v1);
j=LocateVertex(*G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
}
/*
6 9
a b c d e f
a b
a c
a f
f c
b c
b f
c d
d a
e d
*/
code:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define MAXSIZE 100
typedef enum {DG,DN,UG,UN}GraphKind;
typedef struct ArcNode
{int adjvex;InfoPtr *info;struct ArcNode *nextarc;}ArcNode;
typedef struct VNode
{VertexType data;ArcNode *firstarc;
}VNode,AdjList[MAXSIZE];
typedef struct
{AdjList vertex;int vexnum, arcnum;GraphKind kind;}AdjGraph;
int LocateVertex(AdjGraph G, VertexType v);
void CreateGraph(AdjGraph *G);
void DisplayGraph(AdjGraph G);
void DestoryGraph(AdjGraph *G);
int LocateVertex(AdjGraph G, VertexType v)
{int i;for (i = 0; i < G.vexnum; ++i){if (strcmp(G.vertex[i].data, v) == 0){return i;}}return -1;
}
void CreateGraph(AdjGraph *G)
{int i, j, k;VertexType v1, v2;ArcNode *p;cout << "请输入图的顶点数和边数 ";cin >> (*G).vexnum >> (*G).arcnum;cout << "请输入" <<G->vexnum<< "个顶点的值:" << endl;for (i = 0; i < G->vexnum;i++){cin >> G->vertex[i].data;G->vertex[i].firstarc = NULL;}cout << "请输入弧尾 弧头" << endl;for (k = 0; k < G->arcnum;k++){cin >> v1 >> v2;i = LocateVertex(*G, v1);j = LocateVertex(*G, v2);p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->info = NULL;p->nextarc = G->vertex[i].firstarc;G->vertex[i].firstarc = p;}(*G).kind = DG;
}void DestoryGraph(AdjGraph *G)
{int i;ArcNode *p, *q;for (i = 0; i < (*G).vexnum;i++){p = G->vertex[i].firstarc;if (p!=NULL){q = p->nextarc;free(p);p = q;}}(*G).vexnum = 0;(*G).arcnum = 0;
}void DisplayGraph(AdjGraph G)
{int i;ArcNode *p;cout << G.vexnum << "个顶点:" << endl;for (i = 0; i < G.vexnum;i++){cout << G.vertex[i].data << " ";}cout << endl << G.arcnum << "条边:"<<endl;for (i = 0; i < G.vexnum;i++){p = G.vertex[i].firstarc;while (p){cout << G.vertex[i].data << "→" << G.vertex[p->adjvex].data << " ";p = p->nextarc;}cout << endl;}
}void main()
{AdjGraph G;cout << "采用邻接矩阵创建有向图G:" << endl;CreateGraph(&G);cout << "输入有向图G的邻接表:" << endl;DisplayGraph(G);DestoryGraph(&G);system("pause");
}
结果:
图2——利用邻接表创建有向图相关推荐
- 利用邻接表创建无向图
#include<iostream> using namespace std; #define MVNum 100 #define OK 1 typedef char VerTexType ...
- 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。
采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径.设计算法,将一个无向图的邻接矩阵转换为邻接表. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径. 设计算法,将一个无向图的邻 ...
- 6-6 采用邻接表创建无向图
采用邻接表创建无向图G ,依次输出各顶点的度. 函数接口定义: void CreateUDG(ALGraph &G); 其中 G 是采用邻接表表示的无向图. 裁判测试程序样例: #includ ...
- 数据结构与算法A实验六图论---7-11 邻接表创建无向图
采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...
- 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现
上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...
- 使用邻接表创建无向图和有向图
图的邻接表表示法: 邻接表(Adjacency List) 是图的 一 种链式存储结构.在邻接表中,对图中每个顶点V建立一个单链表,把与 V相邻接的顶点放在这个链表中.邻接表中每个单链表的第一个结点存 ...
- 图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)
#include<iostream> #include<string> #include<list> #include<queue> #include& ...
最新文章
- 【pytorch】nn.conv1d的使用
- 【剑指offer-Java版】39二叉树的深度
- java 遍历xml子节点,Axiom解析XML,axiomxml,1、遍历XML全部节点,
- Java中的代码点和代码单元
- Gitlab备份与恢复[七]
- 算法题题目集合一,欢迎评论留言
- 设计模式适配器模式_适配器设计模式示例
- 诺奖得主涉非法实验,其合作者被曝虐待众多病人,被协会除名
- 区间DP--凸多边形三角剖分
- php自带解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南_PHP教程
- AndroidStudio_Android中使用非阻塞延迟的方法_利用Handler实现---Android原生开发工作笔记218
- Django + Uwsgi + Nginx 实现生产环境部署1
- 广州科源980tc数控系统说明书_广州数控GSK980TC3车床数控系统 操作轴名
- MySQL批量插入性能优化
- gcode 解析入门1-1
- c++ fbxsdk安装配置_Linux上安装软件 - coydone
- 电脑cpu风扇转一下就停无法开机_电脑cpu风扇转一下停一下,详细教您电脑cpu风扇转一下停一下怎么办...
- 乌鲁木齐云计算中心将于5月正式竣工并投入使用
- Android使用XML做动画UI
- android 4.4 短信拦截,Android 4.4 KitKat升级率已经接近18%