一. 实验目的和要求
1、掌握图的存储结构:邻接矩阵、邻接表。
2、掌握图的深度优先与广度优先两个搜素算法。
3、学会对图的存储结构进行基本操作。
4、加强综合程序的分析、设计能力。
二. 实验内容
1、现有14个人(分别用字母A、B、… N表示),他们相互之间的朋友关系如图所示(有线相连表示是朋友关系),请分别用邻接矩阵与邻接表表示该关系图,并完成以下功能。
① 以邻接矩阵表示,在此结构上完成:
创建此图;
输出此图的邻接矩阵;
输出从A出发的深度优先搜索序列;
输出从A出发的广度优先搜索序列;
输入两个人p1、p2,判断此两人是否为朋友关系,若不是,给出一种从p1能找到p2的路径;(如输入p1=‘A’、p2=‘N’,则A与N不是直接朋友关系,但可以(不唯一)通过A-B-F-K-N方式联系到N。)
② 以邻接表表示,在此结构上完成:
创建此图;
输出此图的邻接表;
输出从A出发的深度优先搜索序列;
输出从A出发的广度优先搜索序列;
输入两个人p1、p2,判断此两人是否为朋友关系,若不是,给出一种从p1能找到p2的路径;(如输入p1=‘A’、p2=‘N’,则A与N不是直接朋友关系,但可以(不唯一)通过A-B-F-K-N方式联系到N。)
③ 建立头文件AdjMatrix.h和AdjLink.h,分别包含邻接矩阵结构和邻接表结构的操作实现函数,建立主程序文件test6.cpp,在主函数中通过调用来实现上述功能。
④ 自行增加合适的功能,可作为额外的实验成绩进行加分(例如考虑添加或删除一对朋友关系;找出朋友最多的那个人;上面找到A到N的联系路径,若要求找到一条最短的路线怎么找等等)。**
// 主函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20 //最大顶点个数
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef int Status;
typedef int QElemtype; //队列
typedef struct QNode{
QElemtype data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
QueuePtr p;
}LinkQueue;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef int SElemtype;
typedef struct{ //栈
SElemtype *base;
SElemtype *top;
int stacksize;
}SqStack;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef char VertexType;
typedef int VRType; //图 (邻接矩阵声明)
typedef struct{
VertexType Vexs[MAX_VERTEX_NUM]; //顶点向量
VRType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef char Vertextype;
typedef struct ArcNode{
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
// Infotype *info; //该弧相关信息的指针
}ArcNode;
//图 (邻接表声明)
typedef struct VNode{
Vertextype data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数,边数
}ALGraph;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
bool visited[MAX_VERTEX_NUM]; //全局变量布尔数组:访问
#include"AdjMatrix.h"
#include"AdjLink.h"
int main()
{
printf("~~~~~~~~~~~~邻接矩阵~~~~~~~~~~~~\n");
MGraph G;
CreateGraph(G);
SqStack S,S1;
InitStack(S);
FILE *fp,*fp1; //用文件输入更省时省力;
fp=fopen("INPUT2.txt","r");
CreateUDG(G,fp);
printf("邻接矩阵为:\n");
PRINT(G);