头文件: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));
}
//包括弧(边)的相关信息类型的定义及对它的操作
#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 &