由于时间的原因,只是用了邻接矩阵来存储图。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAX_NUM 20
typedef int VertexType;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firststarc;
} VNode,AdjList[MAX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
void Locate(ALGraph G,int &j,VertexType r)
{
for(int i=0;i<G.vexnum;i++)
{
if(r==G.vertices[i].data)
{
j=i;
break;
}
}
}
int CreateGraph(ALGraph &G)
{
printf("请输入顶点个数,弧的个数,数据,关系 ");
VertexType a,b;
int j,k;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum);
for(int i=0;i<G.vexnum;i++)
{
scanf("%d",&G.vertices[i].data);
G.vertices[i].firststarc=NULL;
}
for(int i=0;i<G.arcnum;i++)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
if(!p) return -1;
scanf("%d%d",&a,&b);
Locate(G,j,a);Locate(G,k,b);
if(j<0||k<0) return -1;
p->nextarc=G.vertices[j].firststarc;
G.vertices[j].firststarc=p;
p->adjvex=k;
}
return 0;
}
void DFS(ALGraph G,int i,int flag[])
{
flag[i]=1;
printf("%d",G.vertices[i].data);
ArcNode *p=G.vertices[i].firststarc;
for(;p;p=p->nextarc)
{
if(!flag[p->adjvex]) DFS(G,p->adjvex,flag);
}
}
void DFSTraverse(ALGraph G)
{
int flag[MAX_NUM];
for(int i=0;i<MAX_NUM;i++) flag[i]=0;
for(int i=0;i<G.vexnum;i++)
{
if(!flag[i]) DFS(G,i,flag);
}
}
int main()
{
ALGraph G;
if(CreateGraph(G)<0) printf("有问题");
DFSTraverse(G);
return 0;
}
开始定义多个结构体,用一维数组来存储顶点信息,通过链表的形式使得顶点之间建立联系,即弧。接下来大概讲一下,深度搜索的思路。
定义一个一维数组来查看是否访问过,利用递归来访问与其相邻的顶点,访问的同时令其对应的一维数组值为1,代表访问过,直到全部访问完。
并不能保证完全正确,请多多指出问题。