图的邻接矩阵实现(c)
参考:算法:c语言实现 一书
图的邻接矩阵实现
#ifndef GRAPH
#define GRAPH /*
图的邻接矩阵实现
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h> struct edge{
int v;
int w;
}; struct graph{
int v;
int e;
int **adj;
}; edge EDGE(int v, int w)
{
edge e;
e.v = v; e.w = w;
return e;
} int** matrixInit(int r, int c, int val)
{
int **t = (int**)malloc(r*sizeof(int*));
for (int i = 0; i < r; ++i)
t[i] = (int*)malloc(c*sizeof(int));
for (int i = 0; i < r; ++i)
for (int j = 0; j < c; ++j)
t[i][j] = val;
return t;
} graph* graphInit(int v)
{
graph* g = (graph*)malloc(sizeof(graph));
g->v = v;
g->e = 0;
g->adj = matrixInit(v, v, 0);
return g;
} void graphInsert(graph* g, edge e)
{
int v = e.v, w = e.w;
if (g->adj[v][w] == 0) ++g->e;
g->adj[v][w] = 1;
g->adj[w][v] = 1;
} void graphRemove(graph* g, edge e)
{
int v = e.v, w = e.w;
if (g->adj[v][w] == 1) --g->e;
g->adj[v][w] = 0;
g->adj[w][v] = 0;
} int graphEdge(graph* g, edge a[])
{
int e = 0;
for (int v = 0; v < g->v; ++v)
for (int w = 0; w < g->v; ++w)
if (g->adj[v][w] == 1)
a[e++] = EDGE(v, w);
return e;
} graph* graphCopy(graph* g)
{
graph *cg = graphInit(g->v);
cg->v = g->v;
cg->e = g->e;
for (int i = 0; i < g->v; ++i)
for (int j = 0; j < g->v; ++j)
(cg->adj)[i][j] = (g->adj)[i][j];
return cg;
} void graphDestroy(graph* &g)
{
for (int i = 0; i < g->v; ++i)
free((g->adj)[i]);
free(g->adj);
free(g);
} void graphShow(graph* g)
{
printf("%d vertices, %d edges\n", g->v, g->e);
for (int i = 0; i < g->v; ++i){
printf("%2d:", i);
for (int j = 0; j < g->v; ++j)
if ((g->adj)[i][j] == 1) printf("%2d", j);
printf("\n");
}
} #endif
对各个函数的简单测试:
#include"graph.h" int main()
{
printf("\tgraph of matrix test:\n");
srand(time(NULL));
graph* g = graphInit(10);
edge e[5];
for (int i = 0; i < 5; ++i){
e[i].v = rand() % 10;
e[i].w = rand() % 10;
graphInsert(g, e[i]);
}
graphShow(g);
printf("\n"); graph* cg = graphCopy(g);
graphDestroy(g);
graphRemove(cg, e[1]);
graphShow(cg);
printf("\n"); for (int i = 0; i < 5; ++i)
printf("%d: %d\n", e[i].v, e[i].w);
printf("\n"); edge ee[10];
int cnt=graphEdge(cg, ee);
for (int i = 0; i < cnt; ++i)
printf("%d,%d\n", ee[i].v, ee[i].w);
printf("\n"); }
图的邻接矩阵实现(c)的更多相关文章
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- java 图的邻接矩阵
有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...
- Java图的邻接矩阵实现
/** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...
- 图的邻接矩阵存储实现,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...
- _DataStructure_C_Impl:图的邻接矩阵存储
//_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- c_ 数据结构_图_邻接矩阵
程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1
import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
随机推荐
- bash基础知识
站在用户登录的角度来说,SHELL的类型:登录式shell: 正常通常某终端登录 su - USERNAME su -l USERNAME 非登录式shell: su USERNAME 图形终端下打开 ...
- [Linked List]Remove Nth Node From End of List
Total Accepted: 84303 Total Submissions: 302714 Difficulty: Easy Given a linked list, remove the nth ...
- c++数组操作
一.数组定义和初始化 : 一维数组初始化: : 标准方式一: ]; // value[i]的值不定,没有初始化 : 标准方式二: ] = {,}; // value[0]和value[1]的值分别为1 ...
- Repeater控件实现数据绑定,并实现分页效果
前台显示代码 <pre name="code" class="csharp"><asp:Repeater ID="Repeater1 ...
- VirtualBox安装linux增强工具报错
错误提示: Building the OpenGL support module [FAILED] 解决办法 cd /media/VBOXADDITIO ...
- android Mvp简单实用
View 对应于Activity,负责View的绘制以及与用户交互Model 依然是业务逻辑和实体模型Presenter 负责完成View于Model间的交互 模拟客户端的登录操作,并实现登录成功与登 ...
- Criteria 和 DetachedCriteria的区别与使用(转)
转自:http://javapub.iteye.com/blog/1149709 Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的, ...
- Oracle EBS-SQL (PO-5):采购订单控制信息查询.sql
select distinct pla.po_header_id, --pha.type_lookup_code, pha.segment1 采购订单号, appf.full_name ...
- mvn 一些操作
拷贝依赖包 mvn dependency:copy-dependencies -DoutputDirectory=src/main/webapp/WEB-INF/lib -DincludeScope ...
- EEPROM和flash的区别
存储器分为两大类:ram和rom.ram就不讲了,今天主要讨论rom. rom最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了prom,可以自己写入一次,要是写错了,只能换一片,自认倒霉. ...