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 ...
随机推荐
- python正文(两)
在本文中,我读了记录和总结<Python标准库>一本书,本节课文的学习和理解. 事实上,在Python于,使用一些方法这段文字是一回事,尤其是经常使用.在一般情况下,会用String这样的 ...
- 技术七Gitservergitolite要构建和操作方便
最近,人懒,为了让自己的变化,所以,我决定花时间学习一些新的技术,.对于这些新技术,现在的需求不是很高.只需要在它的入口. 由于本人仅仅是花三四天整出来的东西,所以不洗勿喷,另外难免会有错误,如有还请 ...
- WCF基金会
概念: Windows CommunicationFoundation(WCF)是由微软发展的一组数据通信的应用程序开发接口.能够翻译为Windows通讯接口.它是.NET框架的一部分. 简单地说,W ...
- poj3928 Ping pong 树状数组
http://poj.org/problem?id=3928 Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- 创建Oracle的用户 create user scott identified by tiger;
在命令行里sqlplus 以system身份登录,password是自己设的system C:\Users\Administrator>sqlplus SQL*Plus: Release 10. ...
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
- __weak如何实现目标值自己主动设置nil的
在开始评论__weak机制之前,首先,一些床上用品 ARC 实现 苹果公司的官方介绍说,.ARC这是"内存管理由编译器"的,但事实上,只有编译器不能完全胜任,ARC另外还要看OC执 ...
- ubuntu 在下面 hadoop 安装
这两天已经安装hadoop 这些道路是曲折的,记录它 在redhat安装后一直无法开始datanode,因为jdk 问题,换了一个jdk后问题依然,自己猜測是redhat版本号太低的原因,于是仅仅好舍 ...
- ZipDemo
package swing.zip; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...
- Android 常规任务的高度【schedule】与【scheduleAtFixedRate】差额
于android计划定期任务有两种方法 1.schedule 2.scheduleAtFixedRate 这两种方法的差别在于 首次调用时间(Date when)这个參数 <span style ...