#include<stdio.h>
#include<stdlib.h>
#define SIZE 20
#define LENGTH(a) (sizeof(a)/sizeof(a[0]))
/*
* 用链表存弧信息,一个存弧指向的顶点位置,第二存指向下条弧的指针,这样就将一个顶点指向的所有弧串起来
*/
typedef struct enode {
int v_index;
struct enode *next_edge;
} enode; /*
* 在顶点存顶点名称和第一条依附顶点的弧
*/
typedef struct vnode {
char data;
enode *first_edge;
} vnode; /*
* 用数组存顶点,并加上顶点数和边数共同组成一个图
*/
typedef struct graph {
int v_num;
int e_num;
vnode vs[SIZE];
} graph; /*
* 返回ch在matrix矩阵中的位置
*/
static int get_position(graph g, char ch) {
int i;
for(i=; i<g.v_num; i++) {
if(g.vs[i].data==ch) {
return i;
}
}
return -;
} /*
* 将enode链接到list的末尾
*/
static void link_last(enode *list, enode *node) {
enode *p = list; while(p->next_edge) {
p = p->next_edge;
}
p->next_edge = node;
} /*
* 创建图
*/
graph *create_graph() {
char c1,c2;
char nodes[]= {'A','B','C','D','E','F','G'};
char edges[][] = {
{'A', 'C'},
{'A', 'D'},
{'A', 'F'},
{'B', 'C'},
{'C', 'D'},
{'E', 'G'},
{'F', 'G'},
{'D', 'G'},
{'D', 'B'}
};
int v_len=LENGTH(nodes);
int e_len=LENGTH(edges);
int i,p1,p2;
enode *enode1,*enode2;
graph *pg;
/*初始化并分配空间给图指针*/
if ((pg=(graph*)malloc(sizeof(graph))) == NULL ) {
return NULL;
}
memset(pg, , sizeof(graph));
pg->v_num = v_len;
pg->e_num = e_len; /*初始化所有顶点*/
for(i=; i<pg->v_num; i++) {
pg->vs[i].data = nodes[i];
pg->vs[i].first_edge = NULL;
} /*初始化所有边,无向图的边为两个顶点共有,按指向顶点来定义可以算两条边,因此要挂在两个顶点的邻接表后面*/
for(i=; i<pg->e_num; i++) {
/*获取顶点名*/
c1 = edges[i][];
c2 = edges[i][];
/*获取顶点在数组中的位置*/
p1 = get_position(*pg, c1);
p2 = get_position(*pg, c2); enode1 = (enode*)malloc(sizeof(enode));
enode1->v_index = p2;
/*若边所依附的顶点尚无第一条边,则将这条边赋给顶点的first_edge,否则加在顶点的边链表的最末尾*/
if(pg->vs[p1].first_edge == NULL) {
pg->vs[p1].first_edge = enode1;
} else {
link_last(pg->vs[p1].first_edge, enode1);
} enode2 = (enode*)malloc(sizeof(enode));
enode2->v_index = p1;
if(pg->vs[p2].first_edge == NULL) {
pg->vs[p2].first_edge = enode2;
} else {
link_last(pg->vs[p2].first_edge, enode2);
}
} return pg;
} /*
* 打印邻接表图
*/
void print_graph(graph g)
{
int i,j,k;
enode *node; printf("List Graph:\n");
for (i = ; i < g.v_num; i++)
{
printf("%d(%c): ", i, g.vs[i].data);
node = g.vs[i].first_edge;
while (node != NULL)
{
printf("%d(%c) ", node->v_index, g.vs[node->v_index].data);
node = node->next_edge;
}
printf("\n");
}
} main() {
/*创建图,并打印图*/
graph *pg = create_graph();
print_graph(*pg);
}
List Graph:
(A): (C) (D) (F)
(B): (C) (D)
(C): (A) (B) (D)
(D): (A) (C) (G) (B)
(E): (G)
(F): (A) (G)
(G): (E) (F) (D)

C语言实现常用数据结构——图的更多相关文章

  1. C语言实现常用数据结构——链表

    #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; ...

  2. C语言实现常用数据结构——堆

    #include<stdio.h> #include<stdlib.h> #define CAPACITY 20 /*堆有两个性质: * 1.结构性:堆必须是一颗完全二叉树 * ...

  3. C语言实现常用数据结构——二叉树

    #include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...

  4. C语言实现常用数据结构——队列

    #include<stdio.h> #include<stdlib.h> #define MAX_SIZE 10 /* 用一个动态数组来实现队列 */ typedef stru ...

  5. C语言实现常用数据结构——栈

    #include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...

  6. 动图+源码,演示Java中常用数据结构执行过程及原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  7. 动图+源码,演示 Java 中常用数据结构执行过程及原理

    ​阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...

  8. 1. C语言中的数据结构.md

    C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...

  9. 数据结构--图 的JAVA实现(下)

    在上一篇文章中记录了如何实现图的邻接表.本文借助上一篇文章实现的邻接表来表示一个有向无环图. 1,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进 ...

随机推荐

  1. sql这两个表和查询的组合yii通过使用数据库查询

    sql两个表的组合查询  使用 join on 比如:两个表查询: select u.username, t.title from user u join task t on u.id = t.id; ...

  2. #上海ORACLE用户组2014在论坛#时刻

    #上海ORACLE用户组2014年高峰论坛#精彩瞬间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNrbWFjbGVhbg==/font/5a6L5L ...

  3. 记录一下go web 文档

    https://github.com/astaxie/build-web-application-with-golang

  4. [UWP]在应用开发中安全使用文件资源

    原文:[UWP]在应用开发中安全使用文件资源 在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的. 创建文件或目录时的非法字符检测 在 ...

  5. Win7 64有点找不到MSVCP71.DLL和MSVCR71.dll

     现象: win7启动好多程序都报找不到MSVCP71.DLL,网页上不去,可是非常奇怪的是好像在线给系统打补丁没有受到不论什么影响,能正常打补丁. 解决: 从本机搜索了一下msvcp71.dll ...

  6. 【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案

    转自:https://www.cnblogs.com/stevenluo/p/6030445.html   微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热 ...

  7. 论题Cascade Object Detection with Deformable Part Models一个怀疑

    该文的作者是Pedro F. Felzenszwalb等一下,著名DPM在目标检测模型.本文的工作是DPM(变形组件模型)级联,以加快检测速度. 加速的方式,现在其次是计算总结成绩的某些部分,假设小于 ...

  8. 卷积神经网络(CNN)的理解与总结

    卷积神经网络模型的历史演化: 0. 核心思想 two main ideas: use only local features 在不同位置上使用同样的特征: 池化层的涵义在于,更高的层次能捕捉图像中更大 ...

  9. BIOS 选项设置的含义

    SATA Mode Section: ADHI: Advanced Host Controller Interface - this is a hardware mechanism that allo ...

  10. C# ToString() 数据格式

    double[] numbers= {1054.32179, -195489100.8377, 1.0437E21, -1.0573e-05}; string[] specifiers = { &qu ...