算法七:图的存储结构
2015-07-13 11:14
417 查看
一、邻接矩阵(Adjacency matrix)
1、特点:
容易理解,索引和编排都很舒服。
对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费。
比较适用于稠密图(M相对N^2大很多的图,其中N表示边的条数,M表示顶点歌手)。
2、创建方法:使用二位数组,定点个数(n)等于二维数组的大小(n*n)。
第(i,j)表示顶点i到顶点j是否有边,1表示有边,∞表示没有边。
二、邻接表(Adjacency List)
1、特点:
比较适用于稀疏图(M少于N^2的图)。
可节省存储空间。
在一些计算中降低时间复杂度(比如遍历每一条边的时间复杂度为O(M),如果是稀疏图,M要远远小于N^2)。
2、创建方法:使用单列表,
先根据图中的顶点个数,画出一个直条矩阵框a
;
分析每个顶点与哪个个顶点相连;
把相连的几个顶点依次首尾连接起来,比如0号顶点和1,2,3相连,就一个跟着一个链接下去。
无相图
:
有向图
#include<stdio.h>
#include<stdlib.h>
#defineMAX 10
typedef struct node{
int adjvex;//存放与vi相邻接的顶点vj的序号j。
int weight;//表示边上的信息(如权值
struct node* next;//将邻接表的所有表结点链在一起。
}edgenode;//边表结点
typedef struct vnode{
int vertex;//存放顶点vi的信息
edgenode* firstedge;//vi的邻接表的头指针。
}vertexnode;//顶点表结点
typedef vertexnode adj_list[MAX];//adj_list是邻接表类型
typedef struct adjlist_graph{
int nodes, edges;//图中顶点数和边数
adj_list adjlist;//邻接表,就那个竖立的矩阵,后面挂着很多节点
}algraph;//整个邻接表
static void create_algraph(algraph* g);//建立无向图的邻接表
static void pr_algraph(algraph* g);//输出邻接表
int main(int argc,char** argv)
{
algraph* g;
g = (algraph*)malloc(sizeof(algraph));
create_algraph(g);
printf("the algraph is:\n");
pr_algraph(g);
exit(0);
}
static void create_algraph(algraph* g)
{
edgenode* newnode;
int i, j, k;
printf("please input node number and edge number: ");
scanf("%d%d",&g->nodes,&g->edges);
printf("node number = %d, edges = %d\n", g->nodes,
g->edges);
for(i= 0; i< g->nodes;
i++){
g->adjlist[i].vertex= i;
g->adjlist[i].firstedge=NULL;
}
for(k= 0; k< g->edges;
k++){
printf("please input new edge: ");
scanf("%d%d",&i,&j);
printf("\n");
newnode = (edgenode*)malloc(sizeof(edgenode));
newnode->adjvex= j;
newnode->weight= 0;
newnode->next= g->adjlist[i].firstedge;
g->adjlist[i].firstedge= newnode;
newnode = (edgenode*)malloc(sizeof(edgenode));
newnode->adjvex= i;
newnode->weight= 0;
newnode->next= g->adjlist[j].firstedge;
g->adjlist[j].firstedge= newnode;
}
}
static void pr_algraph(algraph* g)
{
edgenode* node;
int i;
for(i= 0; i< g->nodes;
i++){
node = g->adjlist[i].firstedge;
printf("g->adjlist[%d] = %d: ", i, g->adjlist[i].vertex);
while(node!=NULL){
printf("%d %d\t", node->adjvex,
node->weight);
node = node->next;
}
printf("\n");
}
}
一、邻接矩阵(Adjacency matrix)
1、特点:
容易理解,索引和编排都很舒服。
对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费。
比较适用于稠密图(M相对N^2大很多的图,其中N表示边的条数,M表示顶点歌手)。
2、创建方法:使用二位数组,定点个数(n)等于二维数组的大小(n*n)。
第(i,j)表示顶点i到顶点j是否有边,1表示有边,∞表示没有边。
二、邻接表(Adjacency List)
1、特点:
比较适用于稀疏图(M少于N^2的图)。
可节省存储空间。
在一些计算中降低时间复杂度(比如遍历每一条边的时间复杂度为O(M),如果是稀疏图,M要远远小于N^2)。
2、创建方法:使用单列表,
先根据图中的顶点个数,画出一个直条矩阵框a
;
分析每个顶点与哪个个顶点相连;
把相连的几个顶点依次首尾连接起来,比如0号顶点和1,2,3相连,就一个跟着一个链接下去。
无相图
:
有向图
#include<stdio.h>
#include<stdlib.h>
#defineMAX 10
typedef struct node{
int adjvex;//存放与vi相邻接的顶点vj的序号j。
int weight;//表示边上的信息(如权值
struct node* next;//将邻接表的所有表结点链在一起。
}edgenode;//边表结点
typedef struct vnode{
int vertex;//存放顶点vi的信息
edgenode* firstedge;//vi的邻接表的头指针。
}vertexnode;//顶点表结点
typedef vertexnode adj_list[MAX];//adj_list是邻接表类型
typedef struct adjlist_graph{
int nodes, edges;//图中顶点数和边数
adj_list adjlist;//邻接表,就那个竖立的矩阵,后面挂着很多节点
}algraph;//整个邻接表
static void create_algraph(algraph* g);//建立无向图的邻接表
static void pr_algraph(algraph* g);//输出邻接表
int main(int argc,char** argv)
{
algraph* g;
g = (algraph*)malloc(sizeof(algraph));
create_algraph(g);
printf("the algraph is:\n");
pr_algraph(g);
exit(0);
}
static void create_algraph(algraph* g)
{
edgenode* newnode;
int i, j, k;
printf("please input node number and edge number: ");
scanf("%d%d",&g->nodes,&g->edges);
printf("node number = %d, edges = %d\n", g->nodes,
g->edges);
for(i= 0; i< g->nodes;
i++){
g->adjlist[i].vertex= i;
g->adjlist[i].firstedge=NULL;
}
for(k= 0; k< g->edges;
k++){
printf("please input new edge: ");
scanf("%d%d",&i,&j);
printf("\n");
newnode = (edgenode*)malloc(sizeof(edgenode));
newnode->adjvex= j;
newnode->weight= 0;
newnode->next= g->adjlist[i].firstedge;
g->adjlist[i].firstedge= newnode;
newnode = (edgenode*)malloc(sizeof(edgenode));
newnode->adjvex= i;
newnode->weight= 0;
newnode->next= g->adjlist[j].firstedge;
g->adjlist[j].firstedge= newnode;
}
}
static void pr_algraph(algraph* g)
{
edgenode* node;
int i;
for(i= 0; i< g->nodes;
i++){
node = g->adjlist[i].firstedge;
printf("g->adjlist[%d] = %d: ", i, g->adjlist[i].vertex);
while(node!=NULL){
printf("%d %d\t", node->adjvex,
node->weight);
node = node->next;
}
printf("\n");
}
}
相关文章推荐
- 转!!为什么要java环境变量配置?
- MQTT协议笔记之连接和心跳
- 关于Xcode导入文件夹的2种选择
- 程序存储器 指令寄存器 程序计数器 地址寄存器
- bzoj2876: [Noi2012]骑行川藏 拉格朗日插值
- 在Intellij IDEA中使用Bitbucket管理web工程
- 一个有趣的linux命令
- EnumWindows
- GRE写作必备句型
- android studio 导入android 工程
- sort、uniq、cut、wc 命令详解
- POJ 3170 Knights of Ni(两次BFS啊)
- AS 关于android studio 文件 图标不在,以及智能提示都没有的问题
- 细小知识点之计算机网络
- 在javascript中,哪些值能作为if的条件呢
- 微软2016年校招探星夏令营第二题:最多约数问题
- MS SQLServer 批量附加数据库
- 哈夫曼树(最优二叉树)
- 为什么你学的越多,越没法行动?
- 【unity】拓展系统自带组件的Inspector视图(五)