zoukankan      html  css  js  c++  java
  • 图的顺序存储

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

    接口(头文件):

    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

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

  • 相关阅读:
    jps, jstack, jmap, jhat, jstat
    SpringBoot工程可执行jar修改为可执行war
    SCP后台运行
    frp实现内网远程访问
    SpringBoot项目执行脚本, 自动拉取最新代码并重启
    文本聚合函数(wm_concat, listagg, group_concat, string_agg)
    linux磁盘空间占用分析
    jdbc打印sql语句-p6spy配置
    Linux系统的buff/cache缓存清理脚本
    环境变量及免密登录
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/5505437.html
Copyright © 2011-2022 走看看