#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. vue router 传递参数

    vue-router 传参的方式 query 和params query 类似于get请求的传参方法 就是 ? 这种形式的 https://i.cnblogs.com/EditPosts.aspx?o ...

  2. Gamma 函数与exponential power distribution (指数幂分布)

    1. Γ(⋅) 函数 Γ(α)=∫∞0tα−1e−tdt 可知以下基本性质: Γ(α+1)=αΓ(α) Γ(1)=1 ⇒ Γ(n+1)=n! Γ(12)=π√ 2. 指数幂分布(exponential ...

  3. 【读书笔记】——《A Brief History of Humankind》

    I encourage all of us, whatever our beliefs, to question the basic narratives of our world, to conne ...

  4. 基于VC面部识别软件(识别出人脸特征)

    最近在学校MFC和Opencv,毕业只是做面部识别软件,所以写一个,我觉得很简单. 第一个VC组态opencv.不用说.非常easy,网上资料非常多,然后就是设计界面啦,这个全然凭个人喜好了,我设计的 ...

  5. 构建自己的PHP框架(ORM)

    完整项目地址:https://github.com/Evai/Aier 我们选择 Laravel 的 illuminate/database 作为我们的 ORM 包. 在本系列教程里,每一个 Comp ...

  6. qt翻译--QWaitCondition

    QWaitCondition Class Reference[QtCore module] 该类提供一个情况变量来同步线程. #include <QWaitCondition> 注意:该类 ...

  7. matplotlib简单的新手教程和动画

    做数据分析,首先是要熟悉和理解数据,所以掌握一个趁手的可视化工具是很重要的,否则对数据连个主要的感性认识都没有,怎样进行下一步的design 点击打开链接 还有一个非常棒的资料  Matplotlib ...

  8. .net reactor 学习系列(二)---.net reactor界面各功能说明

    原文:.net reactor 学习系列(二)---.net reactor界面各功能说明         安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...

  9. RGB565与RGB555标志识别位图文件格式

    近日从本地16比特位图读出象素彩色数据,并填充ANDROID的BITMAP数据.发现,使用CAVAS当屏幕显示,照片显示的颜色不正确,找了很多资料,原来发现两个原因: 1.将位图的颜色分量掩码弄错了, ...

  10. 使用 Capistrano 和写作 Ruby 迭代边缘部署

    想边自己写ruby代码,边部署随时能够到处查看,heroku域名又不友好,速度在国内又慢.于是乎想起来capistrano,于是学起 ... capistrano 一点入门认知 https://www ...