#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. Delphi2010,DelphiXE 安装控件找不到DesignIntf 解决办法

    今天安装了一个可以支持IP 地址输入的edit控件,安装后可以放到窗体上,但是编译提示找不到DesignIntf,DesignEditors 从Delphi6开始,就对DesignIntf,Desig ...

  2. 回归(regression)的理解(regressor,回归子)

    1. 基本概念 回归(regression)是监督学习(given {(xi,yi)})的一个重要分类.回归用于预测输入变量(自变量,Xi)与输出变量(因变量,Yi) 之间的关系,特定是当输入变量的值 ...

  3. STL之适配器

    一,STL适配器简介 1.什么是适配器 STL提供了序列式容器,同时针对序列式容器提供了应用于不同场景的容器适配器,通俗讲适配器就是以序列式容器为底层数据结构,进一步封装了的为适应场景应用的容器.ST ...

  4. 用java写的后台方法可以提供给C#调用吗?(转)

    最近和公司搞C#的同事联合搞了一个项目,我把我这边的数据加密之后传给C#,然后C#在对接收到的数据解密.可是问题来了,我这边用JAVA加密的数据C#的同事怎么也解密不出来,于是我就想到了可不可以将JA ...

  5. WPF中的可视化对象(Visual)

    原文:WPF中的可视化对象(Visual) 这是MSDN对Visual的解释:Visual class:Provides rendering support in WPF, which include ...

  6. Mybatis缓存 缓存配置文件 good

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  7. python 教程 第六章、 模块

    第六章. 模块 1) 模块 sys模块 字节编译的.pyc文件,优化编译后生成pyo文件 2) from..import语句 import sys print 'The command line ar ...

  8. leetcode先刷_Pascal&#39;s Triangle II

    三角相对简答题.第一个问题是太简单.我不沾了,我一定会写.其实没什么的第二个问题,与这个问题计算路径有点像一个三角形,假定输入是n,然后从第一行计数到第一n行,保存在数据线上的时间到,由于只有相关的事 ...

  9. Telnet协议详解(远程登陆协议)

    1. 概述 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议.Telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信方法,允许界面终端设备和面向终 ...

  10. Delphi中的线程类 - TThread详解

    Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...