采用codeblock编译器
1.头文件:paint.h
#ifndef PAINT ///必须要有才能被其他文件所识别
#define PAINT
#include <iostream>
#include <queue>
#include <malloc.h>
using namespace std;
///最大值
#define INFINITY INF_MAX
///最大顶点个数
#define MAX_VERTEX_NUM 20
///{有向图,有向网,无向图,无向网}
typedef enum{DG,DN,UDG,UDN} GraphKind;
typedef char VertexType;
/// 图的邻接表存储表示
///表结点结构
typedef struct ArcNode
{
int adjvex; ///该弧所指向的顶点的位置
struct ArcNode* nextarc; ///指向下一条弧的指针
}ArcNode;
typedef struct Vnode
{
VertexType data; ///顶点信息
ArcNode* firstarc ///指向第一条依附该顶点的弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum,arcnum; ///图的当前顶点数和弧数
int kind; ///图的种类标志
}ALGraph;
void Createpaint(ALGraph& G); ///创建一个无向图的邻接链表表示4
void dfs(ALGraph G,int v); ///深度递归遍历
int locatevex(ALGraph G,char v); ///图的基本操作,寻找顶点位置的下标
bool dfstraverse(ALGraph G,int vex);
/**7.22,Judge if it exists a path from vertex ‘i’ to
vertex ‘j’ in digraph ‘g’.
Array ‘visited[]’ has been initialed to ‘false’**/
bool DfsReachabe(ALGraph g,int i,int j);
#endif // PAINT
2.建立一个名为paint(随便取名字)的cpp文件,paint.cpp文件:
#include “paint.h”
#include <iosream>
#include <queue>
#include <malloc.h>
using namespace std;
queue<int>q;
int visited[MAX_VERTEX_NUM];
/**为每个顶点进行编号确定他们的位置**/
int locatevex(ALGraph G,char v)
{
int i=0;
while(i<G.vexnum&&v!=G.vertices[i].data)
{
i++;
}
if(i<G.vexnum)
return i;
}
void Createpaint(ALGraph& G)
{
cout<<“请输入图的顶点数和弧度:”<<endl;
cin>>G.vexnum;
cin>>G.arcnum;
char v1;
char v2;
int v1locate;
int v2locate;
ArcNode* p;
// ArcNode* q;
cout<<“开始输入图的信息”<<endl;
cout<<“输入顶点信息”<<endl;
for(int i=0;i<G.vexnum;i++)
{
cin>>G.vertices[i].data; ///这里每个顶点都有了自己所对应的编号,即为数组的所对应的i;
G.vertices[i].firstarc=NULL; ///先将firsrarc置空,否则会出现野指针乱指,这样就确定了每个顶点
}
for(int k=1;k<=G.arcnum;k++)
{
cout<<“输入相关的边”<<endl;
cin>>v1>>v2;
v1locate=locatevex(G,v1); ///找到v1的编号
v2locate=locatevex(G,v2); ///找到v2的编号
p=new ArcNode; ///建立一个表结点
p->adjvex=v2locate; ///该表结点指向的另一个表结点的编号位置
p->nextarc=G.vertices[v1locate].firstarc; ///这里的指针不是很懂,希望有人可以用图示画一下解释一下
G.vertices[v1locate].firstarc=p;
}
}
///对所有的表结点的visited数组赋初值为1
void dfs(ALGraph G,int v)
{
visited[v]=1;
cout<<G.vertices[v].data<<” “;
for(ArcNode* p=G.vertices[v].firstarc;p;p=p->nextarc) ///该处是如何递归的?
{
if(!visited[p->adjvex])
dfs(G,p->adjvex);
}
}
///先将所有visited数组的初值赋为0,然后对在visited数组中位置为vex的值赋为1,进行标记
bool dfstraverse(ALGraph G,int vex)
{
for(int i = 0;i < G.vexnum;++i)
{
visited[i] = 0;///访问数组初始化
}
dfs(G,vex);
for(int v = 0;v < G.vexnum;++v)
{
if(!visited[v])
{
dfs(G,v);
}
}
return true;
}
bool DfsReachabe(ALGraph g,int i, int j)
{
ArcNode* temp = 0;
if(!g.vexnum||!g.arcnum)
return false;
if(visited[i])
return false;
visited[i] = true;
for(temp = g.vertices[i].firstarc; temp != NULL; temp = temp->nextarc)
{
if(temp->adjvex == j)
return true;
if(DfsReachabe(g,temp->adjvex,j))
return true;
}
return false;
}
建立一个main.cpp:
#include “paint.h”
int main()
{
int a;
ALGraph G;
Createpaint(G);
cout<<“输入图深度遍历的起点”<<endl;
cin>>a;
cout<<“深度优先遍历”<<endl;
dfstraverse(G,a);
if(DfsReachabe(G,0,4))
cout<<“\nThe arc is exit\n”<<endl;
else
cout<<“\nNo arc\n”<<endl;
return 0;
}