图的三种存储方式
2013-02-22 10:37
120 查看
之前总结过一次。详见本博客或者是另一篇。
不过呢。写起来。还是今天的简单易写(学长教的)。
测试数据my.txt.
邻接矩阵:
边表:
邻接表(动态):
邻接表(静态):
运行结果:
不过呢。写起来。还是今天的简单易写(学长教的)。
测试数据my.txt.
邻接矩阵:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 const int INF = (1<<23); int G[MAXN][MAXN]; int main(){ //freopen("d:\\my.txt", "r", stdin); int n, m, i, j, u, v, w; scanf("%d %d", &n, &m); for(i=1; i<=n; i++) for(j=1; j<=n; j++) G[i][j] = INF; for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); G[u][v] = G[v][u] = w; //无向图 } for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); for(j=1; j<=n; j++)if(G[i][j] != INF){ printf("%d ", j); } putchar('\n'); } return 0; }
边表:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXM 100 //最大边数 #define MAXN 10 //最大顶点数 struct node{ int v, w; int next; }g[MAXM]; int head[MAXN], t; void Init(){ t = 0; memset(head, -1, sizeof(head)); } void add(int u, int v, int w){ g[t].v = v; g[t].w = w; g[t].next = head[u]; head[u] = t; t++; } int main(){ //freopen("d:\\my.txt", "r", stdin); int n, m, i, j, u, v, w; scanf("%d %d", &n, &m); Init(); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); add(v, u, w); //因为该图为无向图 } for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); for(j=head[i]; j != -1; j=g[j].next){ printf("%d ", g[j].v); } putchar('\n'); } return 0; }
邻接表(动态):
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 struct node{ int v, w; struct node *next; }*head[MAXN]; void Init(){ memset(head, 0, sizeof(head)); } void add(int u, int v, int w){ struct node *p = (struct node *)malloc(sizeof(struct node)); p->v = v; p->w = w; p->next = head[u]; head[u] = p; } int main(){ //freopen("d:\\my.txt", "r", stdin); int n, m, i, u, v, w; scanf("%d %d", &n, &m); Init(); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); add(v, u, w); //双向 } for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); struct node *p; for(p=head[i]; p != NULL; p = p->next){ printf("%d ", p->v); } putchar('\n'); } return 0; }
邻接表(静态):
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 #define MAXM 10000 struct node{ int v, w; struct node *next; }*head[MAXN]; struct node mem[MAXM]; int t; void Init(){ t = 0; memset(head, 0, sizeof(head)); } void add(int u, int v, int w){ struct node *p = &mem[t++]; p->v = v; p->w = w; p->next = head[u]; head[u] = p; } int main(){ freopen("d:\\my.txt", "r", stdin); int n, m, i, u, v, w; scanf("%d %d", &n, &m); Init(); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); add(v, u, w); //双向 } for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); struct node *p; for(p=head[i]; p != NULL; p = p->next){ printf("%d ", p->v); } putchar('\n'); } return 0; }
运行结果:
相关文章推荐
- 存储过程中遍历游标的三种方式(For,Fetch,While)
- SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)
- Android 数据存储三种方式
- DAS、SAN和NAS三种存储方式
- 存储入门:主机与ISCSI设备之间三种连接方式
- DB2的三种存储过程的递归方式(2)
- 三种本地存储方式
- Hive metastore三种存储方式
- 稀疏矩阵的三种存储方式
- java调用oracle存储过程的三种方式
- 存储入门:主机与ISCSI设备之间三种连接方式
- DAS、NAS、SAN三种存储方式的比较
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 存储整合的常见三种方式
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
- MySQL存储过程和自定义函数、Navicat、创建存储过程和函数、调用存储过程和函数、三种方式、In和Out类型参数、
- 了解三种C++存储方式
- 总结JavaScript三种数据存储方式之间的区别
- MySQL存储过程和自定义函数、Navicat、创建存储过程和函数、调用存储过程和函数、三种方式、In和Out类型参数、
- hive安装过程:metastore(元数据存储)的三种方式之远端mysql方式