• 有向图的邻接矩阵--p136


    源程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>

    #define MAX 100
    #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z')))
    #define LENGTH(a) (sizeof(a)/sizeof(a[0]))

    // 邻接矩阵
    typedef struct _graph
    {
      char vexs[MAX]; // 顶点集合
      int vexnum; // 顶点数
      int edgnum; // 边数
      int matrix[MAX][MAX]; // 邻接矩阵
    }Graph, *PGraph;

    /*
    * 返回ch在matrix矩阵中的位置
    */
    static int get_position(Graph g, char ch)
    {
      int i;
      for (i = 0; i<g.vexnum; i++)
        if (g.vexs[i] == ch)
          return i;
        return -1;
    }

    /*
    * 读取一个输入字符
    */
    static char read_char()
    {
      char ch;

      do

        {
        ch = getchar();
        }while (!isLetter(ch));
      return ch;
    }

    /*
    * 创建图(自己输入)
    */
    Graph* create_graph()
    {
      char c1, c2;
      int v, e;
      int i, p1, p2;
      Graph* pG;

      // 输入"顶点数"和"边数"
      printf("input vertex number: ");
      scanf("%d", &v);
      printf("input edge number: ");
      scanf("%d", &e);
      if (v < 1 || e < 1 || (e >(v * (v - 1))))
      {
        printf("input error: invalid parameters! ");
        return NULL;
      }

      if ((pG = (Graph*)malloc(sizeof(Graph))) == NULL)
        return NULL;
      memset(pG, 0, sizeof(Graph));

      // 初始化"顶点数"和"边数"
      pG->vexnum = v;
      pG->edgnum = e;
      // 初始化"顶点"
      for (i = 0; i < pG->vexnum; i++)
      {
        printf("vertex(%d): ", i);
        pG->vexs[i] = read_char();
      }

      // 初始化"边"
      for (i = 0; i < pG->edgnum; i++)
      {
        // 读取边的起始顶点和结束顶点
        printf("edge(%d):", i);
        c1 = read_char();
        c2 = read_char();

        p1 = get_position(*pG, c1);
        p2 = get_position(*pG, c2);
        if (p1 == -1 || p2 == -1)
        {
          printf("input error: invalid edge! ");
          free(pG);
          return NULL;
        }

        pG->matrix[p1][p2] = 1;
      }

    return pG;
    }

    /*
    * 创建图(用已提供的矩阵)
    */
    Graph* create_example_graph()
    {
      char vexs[] = { 'A', 'B', 'C', 'D', 'E'};
      char edges[][2] = {
      { 'A', 'B' },
      { 'B', 'C' },
      { 'B', 'E' },
      { 'C', 'E' },
      { 'D', 'C' },
      { 'E', 'B' },
      { 'E', 'D' } };
      int vlen = LENGTH(vexs);
      int elen = LENGTH(edges);
      int i, p1, p2;
      Graph* pG;

      // 输入"顶点数"和"边数"
      if ((pG = (Graph*)malloc(sizeof(Graph))) == NULL)
        return NULL;
      memset(pG, 0, sizeof(Graph));

      // 初始化"顶点数"和"边数"
      pG->vexnum = vlen;
      pG->edgnum = elen;
      // 初始化"顶点"
      for (i = 0; i < pG->vexnum; i++)
      {
        pG->vexs[i] = vexs[i];
      }

      // 初始化"边"
      for (i = 0; i < pG->edgnum; i++)
      {
        // 读取边的起始顶点和结束顶点
        p1 = get_position(*pG, edges[i][0]);
        p2 = get_position(*pG, edges[i][1]);

        pG->matrix[p1][p2] = 1;
      }
      return pG;
    }

    /*
    * 打印矩阵队列图
    */
    void print_graph(Graph G)
    {
      int i, j;

      printf("Martix Graph: ");
      for (i = 0; i < G.vexnum; i++)
      {
        for (j = 0; j < G.vexnum; j++)
          printf("%d ", G.matrix[i][j]);
        printf(" ");
      }
    }

    void main()
    {
      Graph* pG;

      // 自定义"图"(输入矩阵队列)
      //pG = create_graph();
      // 采用已有的"图"
      pG = create_example_graph();

      print_graph(*pG); // 打印图

    }

    运行结果:

  • 相关阅读:
    搭建个人Spring-Initializr服务器
    “不蒜子”统计总访问人数脚本
    基于Hazelcast及Kafka实现的分布式锁与集群负载均衡
    虚拟机部署hadoop集群
    程序员、黑客及开发者之间的区别
    今日校园自动登录教程
    逆向DES算法
    来自穷逼对HttpCanary的蹂躏
    今日校园提交签到和查寝-Java实现
    JS 判断数据类型方法
  • 原文地址:https://www.cnblogs.com/duanqibo/p/11981720.html
Copyright © 2020-2023  润新知