一、邻接矩阵(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[n];
分析每个顶点与哪个个顶点相连;
把相连的几个顶点依次首尾连接起来,比如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");
}
}


被折叠的 条评论
为什么被折叠?



