数组表示法建立图

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<assert.h>
#define OK  1
#define ERROR 0

#define INFINITY -1        /* -1代表无穷 */
#define MAX_VERTEX_NUM 20       /* 最大顶点个数 */
typedef int VertexType;        /* 向量的类型 */
typedef int InfoType;        /* 弧相关信息指针类型 */
typedef int VRType;         /* 结点关系值的类型 */

typedef enum {DG, DN, UDG, UDN} GraphKind;   /* 有向图,有向网,无向图,无向网 */


typedef struct ArcCell        /* 弧或边的结构体 */
{
 VRType  adj;        /* VRType是顶点关系类型。对无权图,用 1 或者 0 */
             /* 用来表示是否相邻;对带权图,则为权值类型。 */
 InfoType *info;        /* 该弧相关信息的指针 */
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
 VertexType vexs[MAX_VERTEX_NUM];    /* 顶点向量 */
 AdjMatrix arcs;        /* 邻接矩阵(保存数据的矩阵) */
 int   vexnum,arcnum;      /* 图的当前顶点数和弧数 */
 GraphKind kind;        /* 图的类型标志 */
}MGraph;


#if 0

int CreateGraph(MGraph **G)
{
 /*
 ** 采用数组(邻接矩阵)表示法,构造图G
 */
 scanf("%d",&(*G)->kind);
 switch((*G)->kind)
 {
 case DG:
  return GreateDG(MGraph **G);  /* 构造有向图 */
 case DN:
  return CreateDN(MGraph **G);  /* 构造有向网 */
 case UDG:
  return CreateUDG(MGraph **G);  /* 构造无向图 */
 case UDN:
  return CreateUDN(MGraph **G);  /* 构造无向网 */
 default:
  return ERROR;
 }
 return OK;
}

#endif

int LocateVex(MGraph *G, VertexType v)  /* 返回顶点的数组下标位置 */
{
 if(!G)
  return -1;

 /* 用折半查找 */
 int low, high, mid;
 low = 0;
 high = G->vexnum - 1;
 while(low <= high)
 {
  mid = (low + high) / 2;
  if(G->vexs[mid] == v)
   return mid;
  else if(G->vexs[mid] < v)
   low += 1;
  else
   high -=1;
 }
 return -1;
}

int Input(InfoType *info)     /* 输入弧的信息 */
{
 printf("please input arc message: ");
 scanf("%d",info);
 return OK;
}

int CreateUDN(MGraph **G)
{
 /*
 ** 采用数组,(邻接矩阵)表示法,构造无向网G
 */

 assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
 int IncInfo;             /* 工作变量 */
 int i, j, k;             /* 工作变量 */
 int v1, v2, w;             /* 一条边依附的顶点及权值 */
 printf("please input vexnum, arcnum and IncInfo:/n");
 scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo);  /* IncInfo为0则各弧不含其他信息 */
 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 构造顶点向量 */
 {
  scanf("%d",&(*G)->vexs[i]);
 }

 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 初始化邻接矩阵 */
 {
  for(j = 0 ; j < (*G)->vexnum ; j++)
  {
   (*G)->arcs[i][j].adj = INFINITY;
   (*G)->arcs[i][j].info = 0;
  }
 }
 
 for(k = 0 ; k < (*G)->arcnum ; k++)        /* 构造邻接矩阵 */
 {
  scanf("%d%d%d",&v1, &v2, &w);        /* 输入一条边依附的顶点及权值 */
  i = LocateVex((*G), v1);         /* 确定v1在G中的位置 */
  j = LocateVex((*G), v2);         /* 确定v2在G中的位置 */
  (*G)->arcs[i][j].adj = w;         /* 弧(v1,v2)的权值,对无权图用1或0表示 */
  
  if(IncInfo)             /* 若弧含有相关信息,则输入 */
  {
   (*G)->arcs[i][j].info = (InfoType*)malloc    /* 因为info是指针,所以首先要生成空间存放数据 */
    (sizeof(InfoType));
   Input((*G)->arcs[i][j].info);       /* 输入弧的信息 */
  }
  (*G)->arcs[j][i] = (*G)->arcs[i][j];      /* 置(v1,v2)的对称弧(v2,v1) */
 }
 return OK;
}

int CreateDN(MGraph **G)
{
 /*
 ** 采用数组,(邻接矩阵)表示法,构造有向网G
 */

 assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
 int IncInfo;             /* 工作变量 */
 int i, j, k;             /* 工作变量 */
 int v1, v2, w;             /* 一条边依附的顶点及权值 */
 printf("please input vexnum, arcnum and IncInfo:/n");
 scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo);  /* IncInfo为0则各弧不含其他信息 */
 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 构造顶点向量 */
 {
  scanf("%d",&(*G)->vexs[i]);
 }

 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 初始化邻接矩阵 */
 {
  for(j = 0 ; j < (*G)->vexnum ; j++)
  {
   (*G)->arcs[i][j].adj = INFINITY;
   (*G)->arcs[i][j].info = 0;
  }
 }
 
 for(k = 0 ; k < (*G)->arcnum ; k++)        /* 构造邻接矩阵 */
 {
  scanf("%d%d%d",&v1, &v2, &w);        /* 输入一条边依附的顶点及权值 */
  i = LocateVex((*G), v1);         /* 确定v1在G中的位置 */
  j = LocateVex((*G), v2);         /* 确定v2在G中的位置 */
  (*G)->arcs[i][j].adj = w;         /* 弧(v1,v2)的权值,对无权图用1或0表示 */
  
  if(IncInfo)             /* 若弧含有相关信息,则输入 */
  {
   (*G)->arcs[i][j].info = (InfoType*)malloc    /* 因为info是指针,所以首先要生成空间存放数据 */
    (sizeof(InfoType));
   Input((*G)->arcs[i][j].info);       /* 输入弧的信息 */
  }
 }
 return OK;
}

int CreateUDG(MGraph **G)
{
 /*
 ** 采用数组,(邻接矩阵)表示法,构造无向图G
 */

 assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
 int IncInfo;             /* 工作变量 */
 int i, j, k;             /* 工作变量 */
 int v1, v2, w;             /* 一条边依附的顶点及权值 */
 printf("please input vexnum, arcnum and IncInfo:/n");
 scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo);  /* IncInfo为0则各弧不含其他信息 */
 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 构造顶点向量 */
 {
  scanf("%d",&(*G)->vexs[i]);
 }

 for(i = 0 ; i < (*G)->vexnum ; i++)        /* 初始化邻接矩阵 */
 {
  for(j = 0 ; j < (*G)->vexnum ; j++)
  {
   (*G)->arcs[i][j].adj = INFINITY;
   (*G)->arcs[i][j].info = 0;
  }
 }
 
 for(k = 0 ; k < (*G)->arcnum ; k++)        /* 构造邻接矩阵 */
 {
  scanf("%d%d%d",&v1, &v2, &w);        /* 输入一条边依附的顶点及权值 */
  i = LocateVex((*G), v1);         /* 确定v1在G中的位置 */
  j = LocateVex((*G), v2);         /* 确定v2在G中的位置 */
  (*G)->arcs[i][j].adj = w;         /* 弧(v1,v2)的权值,对无权图用1或0表示 */
  
  if(IncInfo)             /* 若弧含有相关信息,则输入 */
  {
   (*G)->arcs[i][j].info = (InfoType*)malloc    /* 因为info是指针,所以首先要生成空间存放数据 */
    (sizeof(InfoType));
   Input((*G)->arcs[i][j].info);       /* 输入弧的信息 */
  }
  (*G)->arcs[j][i] = (*G)->arcs[i][j];      /* 置(v1,v2)的对称弧(v2,v1) */
 }
 return OK;
}
int PrintMatrix(MGraph *G)           /* 打印邻接矩阵 */
{
 int i, j;
 for(i = 0 ; i < G->vexnum ; i++)
 {
  for(j = 0 ; j < G->vexnum ; j++)
  {
   printf("%5d",G->arcs[i][j]);
  }
  printf("/n");
 }
 return OK;
}

void main()
{
 MGraph *G = NULL;
 //CreateUDN(&G);  /* 建立无向网 */
 CreateDN(&G);   /* 建立有向网 */
 PrintMatrix(G);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值