Bootstrap

图的数组表示方法



头文件:head.h

 // head.h (文件名)
 #include<string.h> // 字符串函数头文件
 #include<ctype.h> // 字符函数头文件
 #include<malloc.h> // malloc()等
 #include<limits.h> // INT_MAX等
 #include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
 #include<stdlib.h> // atoi(),exit()
 #include<io.h> // eof()
 #include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等
 #include<sys/timeb.h> // ftime()
 #include<stdarg.h> // 提供宏va_start,va_arg和va_end,用于存取变长参数表
 // 函数结果状态代码。在教科书第10页
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 // #define INFEASIBLE -1 没使用
 // #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
 typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE,第7、8章用到

顶点信息类型及其操作:VertexType.cpp

 //包括顶点信息类型的定义及对它的操作
 #define MAX_NAME 9 // 顶点名称字符串的最大长度+1
 struct VertexType // 最简单的顶点信息类型(只有顶点名称)
 { char name[MAX_NAME]; // 顶点名称
 };

 void Visit(VertexType ver) // 与之配套的访问顶点的函数
 { printf("%s ",ver.name);
 }

 void Input(VertexType &ver) // 与之配套的输入顶点信息的函数
 { scanf_s("%s",ver.name, _countof(ver.name));
 }

 void InputFromFile(FILE* f,VertexType &ver) // 与之配套的从文件输入顶点信息的函数
 { fscanf_s(f,"%s",ver.name, _countof(ver.name));
 }


弧的相关信息及其操作:ArcsType.cpp


 //包括弧(边)的相关信息类型的定义及对它的操作
 #define MAX_INFO 20 // 弧(边)的相关信息字符串的最大长度+1
 typedef char InfoType; // 弧(边)的相关信息类型

 void InputArc(InfoType* &arc) // 与之配套的输入弧(边)的相关信息的函数
 { char s[MAX_INFO]; // 临时存储空间
   int m;
   printf("请输入该弧(边)的相关信息(<%d个字符):",MAX_INFO);
   gets_s(s, MAX_INFO); // 输入字符串(可包括空格)
   m=strlen(s); // 字符串长度
   if(m) // 长度不为0
   { arc=(char*)malloc((m+1)*sizeof(char)); // 动态生成相关信息存储空间
     strcpy_s(arc,MAX_INFO, s); // 复制s到arc
   }
 }

 void InputArcFromFile(FILE* f,InfoType* &arc) // 由文件输入弧(边)的相关信息的函数
 { char s[MAX_INFO]; // 临时存储空间
   fgets(s,MAX_INFO,f); // 由文件输入字符串(可包括空格)
   arc=(char*)malloc((strlen(s)+1)*sizeof(char)); // 动态生成相关信息存储空间
   strcpy_s(arc, MAX_INFO, s); // 复制s到arc
 }

 void OutputArc(InfoType* arc) // 与之配套的输出弧(边)的相关信息的函数
 { printf("%s\n",arc);
 }

图的数组(邻接矩阵)表示形式:matrix_stru.h

 //图的数组(邻接矩阵)存储结构。在教科书第161页
 #define INFINITY INT_MAX // 用整型最大值代替∞
 typedef int VRType; // 定义顶点关系类型为整型,与INFINITY的类型一致
 #define MAX_VERTEX_NUM 26 // 最大顶点个数
 enum GraphKind{DG,DN,UDG,UDN}; // {有向图,有向网,无向图,无向网}
 typedef struct // 边(弧)信息结构
 { VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值
   InfoType *info; // 该弧相关信息的指针(可无)
 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 二维数组
 struct MGraph // 图的结构
 { VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量
   AdjMatrix arcs; // 邻接矩阵(二维数组)
   int vexnum,arcnum; // 图的当前顶点数和弧数
   GraphKind kind; // 图的种类标志
 };

算法实现:Com.cpp

 // bo7-1.cpp 图的邻接矩阵存储(存储结构由c7-1.h定义)的基本操作(17个),包括算法7.1,7.2
 int LocateVex(MGraph G,VertexType u)
 { // 初始条件:图G存在,u和G中顶点有相同特征(顶点名称相同)
   // 操作结果:若G中存在顶点u,则返回该顶点在图中位置(序号);否则返回-1
   int i;
   for(i=0;i<G.vexnum;++i) // 对于所有顶点依次查找
     if(strcmp(u.name,G.vexs[i].name)==0) // 顶点与给定的u的顶点名称相同
       return i; // 返回顶点序号
   return -1; // 图G中不存在与顶点u有相同名称的顶点
 }

 void CreateDG(MGraph &
;