C语言实现常用数据结构——图
- #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语言实现常用数据结构——图的更多相关文章
- C语言实现常用数据结构——链表
#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; ...
- C语言实现常用数据结构——堆
#include<stdio.h> #include<stdlib.h> #define CAPACITY 20 /*堆有两个性质: * 1.结构性:堆必须是一颗完全二叉树 * ...
- C语言实现常用数据结构——二叉树
#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...
- C语言实现常用数据结构——队列
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 10 /* 用一个动态数组来实现队列 */ typedef stru ...
- C语言实现常用数据结构——栈
#include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...
- 1. C语言中的数据结构.md
C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...
- 数据结构--图 的JAVA实现(下)
在上一篇文章中记录了如何实现图的邻接表.本文借助上一篇文章实现的邻接表来表示一个有向无环图. 1,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进 ...
随机推荐
- 类的XML序列化(XML Serialization)
最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变.开始错误的使用了static,导致了致命的共享错误.后来突然想起C#类能够使用XML序列化 ...
- python reversed
reversed()函数是返回序列seq的反向访问的迭代子.参数可以是列表,元组,字符串,不改变原对象. 例题: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事 ...
- 联合概率(joint probability)、分布函数(distribution function)
0. PMF 与 PDF 的记号 PMF:PX(x) PDF:fX(x) 1. 联合概率 联合概率:是指两个事件同时发生的概率. P(A,B)=P(B|A)⋅P(A)⇒P(B|A)=P(A,B)P(A ...
- NYOJ 24 素数的距离问题
素数的距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描写叙述 如今给出你一些数.要求你写出一个程序,输出这些整数相邻近期的素数,并输出其相距长度.假设左右有等距离长 ...
- phpstorm 删除空行
思路: 用正则把所有空行找到,然后一键全部替换. 步骤:首先把 Regex 打上勾ctrl+f 搜索框就填写正则规则:^\nctrl+r 匹配到所有空行之后,点击[Replace all]即可
- ZOJ 3726 RMQ + 二分法
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5072 区域赛真干的话题 通过率最高的一个问题 不到一半认为这OK 然后WA果 ...
- [Gevent]gevent 网络抓取问答
我听说过gevent基于事件的异步处理功能 如何高效率,该项目已很少使用,今天是没什么学习一些简单的使用. 有正式书面一个非常好的教程 中国版的地址:http://xlambda.com/gevent ...
- Swift 的 Currying 特性 | SwiftCafe 咖啡时间
Currying 也是 Swift 的众多先进特性之一,用一句话说就是将接受多个参数的函数,转变成每次之接受一个参数的调用序列. 上面一句话说得可能大家感觉不是那么清楚,那么没关系,咱们举一个例子来说 ...
- sql 多列求和
列相加即可注意Null不可加,先用ISNULL方法验证,设置默认值 SELECT ID, Name, Province, City, District, ISNULL(row1, 0), ISNULL ...
- MultiBinding
<StackPanel> <Slider x:Name="sl1" Minimum="10" Maximum="100"/ ...