算法七:图的存储结构



一、邻接矩阵(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");
     }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值