有向图的邻接矩阵--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); // 打印图

}

运行结果:

原文地址:https://www.cnblogs.com/duanqibo/p/11981720.html