您的位置:首页 > 其它

算法七:图的存储结构

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");

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: