• 邻接表构建图


     

    一个是顶点表,包括顶点和指向下一个邻接点的指针

    一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针

    刚开始的时候把顶点表初始化,指针指向null。然后边表插入进来,是插入到前一个,也就是直接插入到firstedge指向的下一个,而后面的后移
     1 #include <stdio.h>  
     2 #include <stdlib.h>  
     3 //定义最大的定点的个数为100
     4 #define  MaxVertexNum 100  
     5   
     6 typedef char VertexType;
     7 /*边表节点*/
     8 typedef struct node   
     9 {  
    10    int adjvex;//指示具体顶点的存储位置index
    11    node* next;//下一个边表节点的位置
    12 }EdgeNode;
    13 /*顶点表节点*/
    14 typedef struct 
    15 {  
    16    VertexType vertex;//顶点名
    17    EdgeNode* firstedge;//指示后继的边表节点
    18 }VertexNode;  
    19 //顶点表节点重命名 AdjList一维数组,依次从上向下存储,index 0 1 2 3...
    20 typedef VertexNode AdjList[MaxVertexNum];  
    21 
    22 typedef struct   
    23 {   
    24     AdjList adjlist; //顶点表数组
    25     int n,e;         //定义了图的顶点数和边数
    26 }ALGraph;  
    27 /*创建无向图的方法*/
    28 void create(ALGraph*);  
    29   
    30 void main()  
    31 {  
    32     //为图分配堆空间
    33    ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));
    34    //创建无向图
    35    create(G);
    36    //循环图的顶点数
    37    for (int i=0;i< G->n;i++)  
    38    {  
    39        printf("%d->",i);
    40        while(G->adjlist[i].firstedge!=NULL)  
    41        {  
    42             printf("%d->",G->adjlist[i].firstedge->adjvex);  
    43             G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;
    44        }  
    45        printf("
    ");  
    46    }  
    47 }
    48 /*创建无向图的方法*/
    49 void create(ALGraph* G)  
    50 {  
    51     int i,j,k,w,v;
    52     //申明边表节点
    53     EdgeNode *s;
    54     //确定一个图的顶点数目和边的数目
    55     printf("读入顶点数和边数:
    ");  
    56     scanf("%d,%d",&G->n,&G->e);
    57     //通过顶点的数目,建立顶点表
    58     for (i=0;i<G->n;i++)  
    59    {  
    60        fflush(stdin);  
    61        printf("建立顶点表");
    62        //读入顶点名
    63        G->adjlist[i].vertex=getchar();
    64        //每个顶点的指向为Null
    65        G->adjlist[i].firstedge=NULL;  
    66    }
    67     //开始建立边表
    68    printf("建立边表
    "); 
    69    //通过边数控制循环
    70    for (k=0;k<G->e;k++)  
    71    {  
    72        //代表vi和vj之间存在边
    73        printf("读入(vi-vj)的顶点对序号");  
    74        scanf("%d,%d",&i,&j);
    75        //为边表分配空间
    76        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
    77        s->adjvex=j;
    78        s->next=G->adjlist[i].firstedge;  //插入表头  
    79        G->adjlist[i].firstedge=s;
    80 
    81        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
    82        s->adjvex=i;  
    83        s->next=G->adjlist[j].firstedge;  
    84        G->adjlist[j].firstedge=s;
    85    }  
    86 }  
  • 相关阅读:
    负载均衡——LVS DR模式
    Java之BigDecimal详解
    Spring AOP代理对象创建流程
    spring aop切面不生效
    aspectj-autoproxy Controller未生效解决方案
    jvm参数分类
    dubbo优雅停机
    Dubbo 协议注意项
    dubbo provider
    查找java_home的安装路径
  • 原文地址:https://www.cnblogs.com/jiaqingshareing/p/6008720.html
Copyright © 2020-2023  润新知