GeeksforGeeks - Adjacency List邻接矩阵C\C++代码
邻接矩阵的图示:

构建一个这种无向邻接矩阵。
參考站点: http://www.geeksforgeeks.org/graph-and-its-representations/
这里写了个类,添加删除图的操作。
#pragma once
#include <stdio.h>
#include <stdlib.h> class AdjListGraph
{
struct Node
{
int dest;
Node *next;
}; struct List
{
Node *first;
}; struct Graph
{
int vers;
List *verArr;
}; Node *createNode(int dest)
{
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->dest = dest;
newNode->next = nullptr;
return newNode;
} Graph *createGraph(int vers)
{
Graph * gra = (Graph *) malloc(sizeof(Graph));
gra->vers = vers;
gra->verArr = (List *) malloc(vers * sizeof(List));
for (int i = 0; i < vers; i++)
{
gra->verArr[i].first = nullptr;
}
return gra;
} void addEdge(Graph *gra, int src, int dest)
{
Node *n = createNode(dest);
n->next = gra->verArr[src].first;//这里不须要->next,由于无空head指针
gra->verArr[src].first = n; //构造无向图
n = createNode(src);
n->next = gra->verArr[dest].first;
gra->verArr[dest].first = n;
} void printGraph()
{
for (int i = 0; i < graph->vers; i++)
{
Node *n = graph->verArr[i].first;
printf("\n Adjacency list of vertex %d\n head ", i);
while (n)
{
printf("-> %d", n->dest);
n = n->next;
}
putchar('\n');
}
} Graph *graph;
public:
AdjListGraph(int V = 0) : graph(nullptr)
{
graph = createGraph(V);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
printGraph();
} ~AdjListGraph()
{
if (graph)
{
for (int i = 0; i < graph->vers; i++)
{
Node *n = graph->verArr[i].first;
Node *p = nullptr;
while (n)
{
p = n;
n = n->next;
free(p);
}
}
free(graph->verArr);
free(graph);
}
}
};
以下是C++的代码,C++的代码会更加简洁。
使用默认构造函数和使用new的确会方便非常多。
malloc原始快捷,new方便。不用专门设置一个create函数,直接new+构造函数就实现了。
#include <stdio.h>
#include <stdlib.h>
#include <iostream> class AdjListGraph_2
{
struct Node
{
int label;
Node *next;
Node(int l = 0, Node *n = nullptr) : label(l), next(n){}
};
struct Vertice
{
Node *first;
Vertice() : first(nullptr) {}
};
struct Graph
{
int vers;
Vertice *vArr;
Graph(int v = 5) : vers(v)
{
vArr = new Vertice[vers];
}
};
Graph *graph;
public:
AdjListGraph_2(int V = 5) : graph(nullptr)
{
graph = new Graph(V);
addEdge(0, 1);
addEdge(0, 4);
addEdge(1, 2);
addEdge(1, 3);
addEdge(1, 4);
addEdge(2, 3);
addEdge(3, 4);
printGraph();
} void addEdge(int src, int dest)
{
Node *n = new Node(dest);
n->next = graph->vArr[src].first;
graph->vArr[src].first = n; n = new Node(src);
n->next = graph->vArr[dest].first;
graph->vArr[dest].first = n;
}
void printGraph()
{
if (graph)
{
for (int i = 0; i < graph->vers; i++)
{
Node *n = graph->vArr[i].first;
printf("\n The %d vertice's adjcences are :\n V%d", i, i);
while (n)
{
printf(" ->V%d", n->label);
n = n->next;
}
putchar('\n');
}
}
} ~AdjListGraph_2()
{
if (graph)
{
for (int i = 0; i < graph->vers; i++)
{
Node *n = graph->vArr[i].first;
while (n)
{
Node *p = n;
n = n->next;
delete p;
}
}
delete [] graph->vArr;
delete graph;
}
}
};
GeeksforGeeks - Adjacency List邻接矩阵C\C++代码的更多相关文章
- 邻接矩阵有向图(三)之 Java详解
前面分别介绍了邻接矩阵有向图的C和C++实现,本文通过Java实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:h ...
- 邻接矩阵有向图(二)之 C++详解
本章是通过C++实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/s ...
- 邻接矩阵有向图(一)之 C语言详解
本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...
- 邻接矩阵无向图(三)之 Java详解
前面分别介绍了邻接矩阵无向图的C和C++实现,本文通过Java实现邻接矩阵无向图. 目录 1. 邻接矩阵无向图的介绍 2. 邻接矩阵无向图的代码说明 3. 邻接矩阵无向图的完整源码 转载请注明出处:h ...
- 邻接矩阵无向图(二)之 C++详解
本章是通过C++实现邻接矩阵无向图. 目录 1. 邻接矩阵无向图的介绍 2. 邻接矩阵无向图的代码说明 3. 邻接矩阵无向图的完整源码 转载请注明出处:http://www.cnblogs.com/s ...
- 邻接矩阵无向图(一)之 C语言详解
本章介绍邻接矩阵无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...
- Matlab 图论最短路问题模型代码
最短路问题的基本内容 最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题.在这里的距离可以理解成各种两 ...
- 算法笔记 #007# Backtracking
留着备用. 题目描述和代码参考:https://www.geeksforgeeks.org/8-queen-problem/ NQueenProblem(js代码): class NQueenProb ...
- WGCNA构建基因共表达网络详细教程
这篇文章更多的是对于混乱的中文资源的梳理,并补充了一些没有提到的重要参数,希望大家不会踩坑. 1. 简介 1.1 背景 WGCNA(weighted gene co-expression networ ...
随机推荐
- LayoutInflater使用
在实际工作中,事先写好的布局文件往往不能满足我们的需求,有时会依据情况在代码中自己定义控件,这就须要用到LayoutInflater.LayoutInflater在Android中是“扩展”的意思,作 ...
- 改动symbol link的owner
当/home/jenkins文件夹空间不足的时候,能够先查看哪个文件夹在较大的磁盘分区上,然后将jenkins文件夹移动过去 最后创建/home/jenkins link到新位置. 这时候须要改动sy ...
- 我收集的sonar参考资料
sonarQube代码质量管理工具环境筹建笔记 http://www.myexception.cn/open-source/1307345.html 配置sonar.jenkins进行持续审查 htt ...
- Mybatis简单的入门之增删改查
一般的过程例如以下 1.加入Mybatis所须要的包,和连接数据库所需的包 2.配置mybatis-config.xml文件 3.配置与pojo相应的映射文件 mybatis-config,xml & ...
- hdu3844 Mining Your Own Business,无向双连接组件
点击打开链接 无向图的双连通分量 #include<cstdio> #include<stack> #include<vector> #include<map ...
- freemarker错误九
1.错误叙述性说明 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...
- 找出N之内的所有完数
时间限制: 10 Sec 内存限制: 128 MB 提交: 389 解决: 148 [提交][状态][讨论版] 题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". ...
- ueditor使用注意事项
1.js问题的介绍 第一ueditor型材 <script type="text/javascript" src="ueditor1_4_3-utf8-jsp/ue ...
- 使用js在新窗口中POST数据
最近在做自己的博客,写文章的时候有一个预览功能,当时使用的是弹出框来进行预览,感觉体验不是很好. 然后想到了写邮件时候的新窗口预览,查了下126邮箱和qq邮箱的预览实现效果,以及各种谷歌百度stack ...
- 按某个字段来分组、编号的row_number()函数
本文参考 http://zhidao.baidu.com/link?url=8su4F16Et8Q0S3FmybwniJSI51Ms0AeVujcEXhyEaZh3u5LlOng5Xri_9zHsl7 ...