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,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进 ...
随机推荐
- 经典书单 —— 语言/算法/机器学习/深度学习/AI/CV/PGM
0.0 计算机科学 <Lex 与 Yacc> Think Complexity(使用 Python 语言) GitHub - AllenDowney/ThinkComplexity: Co ...
- TCP/IP之封装,分用,server模型
ios讨论群1群:135718460 1.封装 当应用程序用TCP传送数据时,数据被送入到协议栈中,然后通过每一层直到被当做一串比特流送入网络. 2.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
- jQuery中对象的构建
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- la4080 Warfare And Logistics 罗列+最短
为了图.计算最短随机分ans1.和删除边缘.免费才能够获得最大和短路之间的最大分ans2,如果这两个不沟通.看作是两个点之间的最短距离l. 第一个想法是枚举每个边缘,然后运行n最短时间.但是,这种复杂 ...
- python 强制类型转换 以及 try expect
强制类型转换: 字符串 --> 整型: 字符串 第一个 是 + 或者 - ,会直接去掉 符号 ,返回 数字 如: a = '+123456' s = int(a) print(s) s ...
- WPF 曲线图表控件(自制)(一)
原文:WPF 曲线图表控件(自制)(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/koloumi/article/details/775092 ...
- Android到您的计算机使用命令行屏幕捕获和出口
声明:本博客为原创博客,未经同意.不得转载! 原文链接为http://blog.csdn.net/bettarwang/article/details/27819525 大多数人最经常使用的截屏方法可 ...
- WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果
原文:WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果 本以为Label也有TextChanged 事件,但在使 ...
- 用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)
大家都知道PostMessage会丢消息,但是消息队列的大小是多少呢,下面做了一个测试. 代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, M ...
- [转帖 ]MySQL 5.7 新特性 JSON
MySQL 5.7 新特性 JSON 的创建,插入,查询,更新 作者: 我不是鱼 (2016-08-31 16:13)分类: MySQL 标签: MySQL JSON MySQL JSON 应用 ...