• 图的顺序存储


    同学托我写作业,很简单的图实现问题,用二维数组。

    接口(头文件):

    typedef int DataType;

    typedef struct GraphCDT* Graph;

    Graph newGraph();

    void addNode(Graph graph,DataType data);

    void addEdge(Graph graph,DataType src,DataType dst);

    很久没有建工程文件,很久没写c代码。但是通过写这个作业,我弄清楚2个问题。

    1.sizeof在c语言中不能计算j结构体,比如sizeof(GraphCDT)。但是c++可以。

    2.指针定义的时候要分配空间,不然内存不能written。

    还知道了一种建图的新思路:用一个一维数组存储结点,二维数组存储边。因为如果输入的结点不是1、2、3、4或者a、b、c、d的话,建图的时候二维数组记录图的结点和边的信息很不方便。

    下面给出解决这个题目的c++代码,如有纰漏,欢迎斧正。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #define maxSize 100
     4 typedef int DataType;
     5 typedef struct GraphCDT* Graph;
     6 struct GraphCDT
     7 {
     8     int edg[maxSize][maxSize];
     9     DataType ver[maxSize];
    10     int n;
    11 };
    12 
    13 Graph newGraph()
    14 {
    15     Graph graph;
    16     graph=(Graph)malloc(sizeof(struct GraphCDT));
    17     int i,j;
    18     for(i=0;i<maxSize;i++)
    19         graph->ver[i]=0;
    20     for(i=0;i<maxSize;i++)
    21             for(j=0;j<maxSize;j++)
    22                 graph->edg[i][j]=0;
    23     graph->n=0;
    24     return graph;
    25 }
    26 
    27 void addNode(Graph graph,DataType data)
    28 {
    29     graph->ver[data]=1;
    30     graph->n++;
    31     printf("%n  --- d   
    ",graph->n);
    32 }
    33 void addEdge(Graph graph,DataType src,DataType dst)
    34 {
    35     graph->edg[src][dst]=1;
    36 }
    37 void print(Graph graph)
    38 {
    39     int i,j;
    40     printf("结点:
    ");
    41     for(i=0;i<maxSize;i++)
    42         if(graph->ver[i]!=0)
    43             printf("%d ",i);
    44     printf("
    ");
    45     printf("边:
    ");
    46     for(i=0;i<maxSize;i++)
    47             for(j=0;j<maxSize;j++)
    48                 if(graph->edg[i][j]!=0)
    49                     printf("%d---%d   ",i,j);
    50     printf("
    ");
    51 }
    52 int main()
    53 {
    54     Graph graph;
    55     graph=(Graph)malloc(sizeof(struct GraphCDT));
    56     int flag=1;
    57     int data,src,dst;
    58     graph=newGraph();
    59     while(1)
    60     {
    61         printf("输入您想要加入的新结点(0-99):
    ");
    62         scanf("%d",&data);
    63         addNode(graph,data);
    64         printf("输入您想要加入的边的源结点和目的结点(0-99):
    ");
    65         scanf("%d %d",&src,&dst);
    66         addEdge(graph,src,dst);
    67         print(graph);
    68         printf("继续则输入0,结束则输入1
    ");
    69         scanf("%d",&flag);
    70         if(flag)
    71             break;
    72     }
    73     return 0;
    74 }
    View Code

    【写博客,比起写日记,会更注重措辞和表达。】

  • 相关阅读:
    洛谷题单 算法1-1 模拟和高精度
    第十一届蓝桥杯 b组
    jdk的安装、java环境配置
    哈夫曼树 java
    机器学习基石8-Noise and Error
    Java基础12-工具类;变长参数;IO
    机器学习基石7-The VC Dimension
    Java基础11-List;Set;Map
    Java基础10-集合
    机器学习基石6-泛化理论
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/5505437.html
Copyright © 2020-2023  润新知