1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define SIZE 20
  4. #define LENGTH(a) (sizeof(a)/sizeof(a[0]))
  5. /*
  6. * 用链表存弧信息,一个存弧指向的顶点位置,第二存指向下条弧的指针,这样就将一个顶点指向的所有弧串起来
  7. */
  8. typedef struct enode {
  9. int v_index;
  10. struct enode *next_edge;
  11. } enode;
  12.  
  13. /*
  14. * 在顶点存顶点名称和第一条依附顶点的弧
  15. */
  16. typedef struct vnode {
  17. char data;
  18. enode *first_edge;
  19. } vnode;
  20.  
  21. /*
  22. * 用数组存顶点,并加上顶点数和边数共同组成一个图
  23. */
  24. typedef struct graph {
  25. int v_num;
  26. int e_num;
  27. vnode vs[SIZE];
  28. } graph;
  29.  
  30. /*
  31. * 返回ch在matrix矩阵中的位置
  32. */
  33. static int get_position(graph g, char ch) {
  34. int i;
  35. for(i=; i<g.v_num; i++) {
  36. if(g.vs[i].data==ch) {
  37. return i;
  38. }
  39. }
  40. return -;
  41. }
  42.  
  43. /*
  44. * 将enode链接到list的末尾
  45. */
  46. static void link_last(enode *list, enode *node) {
  47. enode *p = list;
  48.  
  49. while(p->next_edge) {
  50. p = p->next_edge;
  51. }
  52. p->next_edge = node;
  53. }
  54.  
  55. /*
  56. * 创建图
  57. */
  58. graph *create_graph() {
  59. char c1,c2;
  60. char nodes[]= {'A','B','C','D','E','F','G'};
  61. char edges[][] = {
  62. {'A', 'C'},
  63. {'A', 'D'},
  64. {'A', 'F'},
  65. {'B', 'C'},
  66. {'C', 'D'},
  67. {'E', 'G'},
  68. {'F', 'G'},
  69. {'D', 'G'},
  70. {'D', 'B'}
  71. };
  72. int v_len=LENGTH(nodes);
  73. int e_len=LENGTH(edges);
  74. int i,p1,p2;
  75. enode *enode1,*enode2;
  76. graph *pg;
  77. /*初始化并分配空间给图指针*/
  78. if ((pg=(graph*)malloc(sizeof(graph))) == NULL ) {
  79. return NULL;
  80. }
  81. memset(pg, , sizeof(graph));
  82. pg->v_num = v_len;
  83. pg->e_num = e_len;
  84.  
  85. /*初始化所有顶点*/
  86. for(i=; i<pg->v_num; i++) {
  87. pg->vs[i].data = nodes[i];
  88. pg->vs[i].first_edge = NULL;
  89. }
  90.  
  91. /*初始化所有边,无向图的边为两个顶点共有,按指向顶点来定义可以算两条边,因此要挂在两个顶点的邻接表后面*/
  92. for(i=; i<pg->e_num; i++) {
  93. /*获取顶点名*/
  94. c1 = edges[i][];
  95. c2 = edges[i][];
  96. /*获取顶点在数组中的位置*/
  97. p1 = get_position(*pg, c1);
  98. p2 = get_position(*pg, c2);
  99.  
  100. enode1 = (enode*)malloc(sizeof(enode));
  101. enode1->v_index = p2;
  102. /*若边所依附的顶点尚无第一条边,则将这条边赋给顶点的first_edge,否则加在顶点的边链表的最末尾*/
  103. if(pg->vs[p1].first_edge == NULL) {
  104. pg->vs[p1].first_edge = enode1;
  105. } else {
  106. link_last(pg->vs[p1].first_edge, enode1);
  107. }
  108.  
  109. enode2 = (enode*)malloc(sizeof(enode));
  110. enode2->v_index = p1;
  111. if(pg->vs[p2].first_edge == NULL) {
  112. pg->vs[p2].first_edge = enode2;
  113. } else {
  114. link_last(pg->vs[p2].first_edge, enode2);
  115. }
  116. }
  117.  
  118. return pg;
  119. }
  120.  
  121. /*
  122. * 打印邻接表图
  123. */
  124. void print_graph(graph g)
  125. {
  126. int i,j,k;
  127. enode *node;
  128.  
  129. printf("List Graph:\n");
  130. for (i = ; i < g.v_num; i++)
  131. {
  132. printf("%d(%c): ", i, g.vs[i].data);
  133. node = g.vs[i].first_edge;
  134. while (node != NULL)
  135. {
  136. printf("%d(%c) ", node->v_index, g.vs[node->v_index].data);
  137. node = node->next_edge;
  138. }
  139. printf("\n");
  140. }
  141. }
  142.  
  143. main() {
  144. /*创建图,并打印图*/
  145. graph *pg = create_graph();
  146. print_graph(*pg);
  147. }
  1. List Graph:
  2. (A): (C) (D) (F)
  3. (B): (C) (D)
  4. (C): (A) (B) (D)
  5. (D): (A) (C) (G) (B)
  6. (E): (G)
  7. (F): (A) (G)
  8. (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. 类的XML序列化(XML Serialization)

    最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变.开始错误的使用了static,导致了致命的共享错误.后来突然想起C#类能够使用XML序列化 ...

  2. python reversed

    reversed()函数是返回序列seq的反向访问的迭代子.参数可以是列表,元组,字符串,不改变原对象. 例题: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事 ...

  3. 联合概率(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 ...

  4. NYOJ 24 素数的距离问题

    素数的距离问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描写叙述 如今给出你一些数.要求你写出一个程序,输出这些整数相邻近期的素数,并输出其相距长度.假设左右有等距离长 ...

  5. phpstorm 删除空行

    思路: 用正则把所有空行找到,然后一键全部替换. 步骤:首先把 Regex 打上勾ctrl+f 搜索框就填写正则规则:^\nctrl+r 匹配到所有空行之后,点击[Replace all]即可

  6. ZOJ 3726 RMQ + 二分法

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5072 区域赛真干的话题 通过率最高的一个问题 不到一半认为这OK  然后WA果 ...

  7. [Gevent]gevent 网络抓取问答

    我听说过gevent基于事件的异步处理功能 如何高效率,该项目已很少使用,今天是没什么学习一些简单的使用. 有正式书面一个非常好的教程 中国版的地址:http://xlambda.com/gevent ...

  8. Swift 的 Currying 特性 | SwiftCafe 咖啡时间

    Currying 也是 Swift 的众多先进特性之一,用一句话说就是将接受多个参数的函数,转变成每次之接受一个参数的调用序列. 上面一句话说得可能大家感觉不是那么清楚,那么没关系,咱们举一个例子来说 ...

  9. sql 多列求和

    列相加即可注意Null不可加,先用ISNULL方法验证,设置默认值 SELECT ID, Name, Province, City, District, ISNULL(row1, 0), ISNULL ...

  10. MultiBinding

    <StackPanel> <Slider x:Name="sl1" Minimum="10" Maximum="100"/ ...