代码说明:
InitGraph函数参考了某个大佬的文章(侵权的话可以联系我删除)
然后增加了打印函数、深度搜索和广度搜索相关函数
首先定义visited数组,把访问过的结点置为true。
bool visited[MaxNum];
辅助函数:
求结点的第一条边 FirstNeignbor()
int FirstNeignbor(ALGraph G,int v){
return G.vertices[v].first->adjvex;
}
求本边的下一条边 NextNeighbor()
int NextNeighbor(ALGraph G,int v,int w)
{
if(v!=-1)
{
ArcNode *p;
p=G.vertices[v].first;
while(p!=NULL && p->adjvex!=w)
{
p=p->next;
}
if(p!=NULL && p->next!=NULL)
return p->next->adjvex;
}
}
测试样例的图
abcdef 对应 v1、v2......
打印函数 printG()
void printG(ALGraph G)
{
ArcNode *q;
for(int i=0;i<G.vexnum;i++)
{
cout<<"与"<<G.vertices[i].data<<"相连的顶点 : ";
q=G.vertices[i].first;
while(q!=NULL){
cout<<G.vertices[q->adjvex].data<<" ";
q=q->next;
}
cout<<endl;
}
}
运行结果
深度搜索
DFS() 以及DFSTraverse()
void DFS(ALGraph G,int v)
{
cout<<G.vertices[v].data<<" ";
visited[v]= true;
if(G.vertices[v].first!=NULL){
for (int i = FirstNeignbor(G,v); i>=0&&i<MaxNum ; i= NextNeighbor(G,v,i)) {
cout<<""; //运行速度导致的问题?加上这个延迟就好了。
if(!visited[i])
{
DFS(G, i);
}
}
}
}
void DFSTraverse(ALGraph G)
{
cout<<"DFS result :"<<endl;
for(int v=0;v<G.vexnum;++v)
visited[v]= false;
for (int i = 0; i < G.vexnum; ++i) {
if(!visited[i])
{
DFS(G,i);
}
}
}
运行结果
广度搜索
BFS() 以及 BFSTraverse()
void BFS(ALGraph G,int v)
{
queue<char> Q;
cout<<G.vertices[v].data<<" ";
visited[v]= true;
Q.push(G.vertices[v].data);
while(!Q.empty()){
Q.pop();
for(int w = FirstNeignbor(G,v);w>=0&&w<MaxNum;w= NextNeighbor(G,v,w)){
cout<<""; //不可以去掉这一行,可能是执行速度问题
if(!visited[w]){
cout<<G.vertices[w].data<<" ";
visited[w]= true;
Q.push(G.vertices[w].data);
}
}
}
}
void BFSTraverse(ALGraph G)
{
cout<<"BFS result :"<<endl;
for(int i = 0;i<G.vexnum;++i)
{
visited[i] = false;
}
for(int i = 0; i<G.vexnum;++i)
{
if(!visited[i]){
BFS(G,i);
}
}
}
运行结果
最后贴一下整体代码方便运行
#include <iostream>
#include <queue>
using namespace std;
#define MaxNum 100
typedef char Vertextype;
typedef int InfoType;
typedef struct ArcNode{ //边表结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *next; //指向下一条弧的指针
//InfoType info; //图的边权值
}ArcNode;
typedef struct VNode{ //顶点表结点
Vertextype data; //顶点信息
ArcNode *first; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxNum];
typedef struct {
AdjList vertices; //邻接表
int vexnum,arcnum; //图的顶点数和弧数
}ALGraph; //邻接表储存的图类型
void MGraph(ALGraph &G){
G.vertices[MaxNum] = {0};
G.vexnum=0;
G.arcnum=0;
}
int locate(ALGraph G,char v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data==v)
{
return i;
}
}
cout<<"has no this vex"<<endl;
return -1;
}
void InitGraph(ALGraph &G){
cout<<"Input Graph's vexnum and arcnum"<<endl;
cin>>G.vexnum>>G.arcnum;
cout<<"Input vex "<<endl;
for(int i = 0;i<G.vexnum;i++){
cin>>G.vertices[i].data;
G.vertices[i].first=NULL;
}
cout<<"Input arc "<<endl;
char temp_v1 = '0';
char temp_v2 = '0';
for(int j=0;j<G.arcnum;j++)
{
cin>>temp_v1>>temp_v2;
int index_v1 = locate(G,temp_v1);
int index_v2 = locate(G,temp_v2);
ArcNode *p1 = new ArcNode;
p1->adjvex = index_v2;
p1->next = G.vertices[index_v1].first;
G.vertices[index_v1].first=p1;
ArcNode *p2 = new ArcNode;
p2->adjvex = index_v1;
p2->next = G.vertices[index_v2].first;
G.vertices[index_v2].first=p2;
}
cout<<"Init success"<<endl;
}
bool visitedB[MaxNum];
bool visitedD[MaxNum];
int FirstNeignbor(ALGraph G,int v){
return G.vertices[v].first->adjvex;
}
int NextNeighbor(ALGraph G,int v,int w)
{
if(v!=-1)
{
ArcNode *p;
p=G.vertices[v].first;
while(p!=NULL && p->adjvex!=w)
{
p=p->next;
}
if(p!=NULL && p->next!=NULL)
return p->next->adjvex;
}
}
void BFS(ALGraph G,int v)
{
queue<char> Q;
cout<<G.vertices[v].data<<" ";
visitedB[v]= true;
Q.push(G.vertices[v].data);
while(!Q.empty()){
Q.pop();
for(int w = FirstNeignbor(G,v);w>=0&&w<MaxNum;w= NextNeighbor(G,v,w)){
cout<<""; //不可以去掉这一行,可能是执行速度问题
if(!visitedB[w]){
cout<<G.vertices[w].data<<" ";
visitedB[w]= true;
Q.push(G.vertices[w].data);
}
}
}
}
void BFSTraverse(ALGraph G)
{
cout<<"BFS result :"<<endl;
for(int i = 0;i<G.vexnum;++i)
{
visitedB[i] = false;
}
for(int i = 0; i<G.vexnum;++i)
{
if(!visitedB[i]){
BFS(G,i);
}
}
}
void DFS(ALGraph G,int v)
{
cout<<G.vertices[v].data<<" ";
visitedD[v]= true;
if(G.vertices[v].first!=NULL)
{
for (int i = FirstNeignbor(G,v); i>=0&&i<MaxNum ; i= NextNeighbor(G,v,i)) {
cout<<""; //运行速度导致的问题?加上这个延迟就好了。
if(!visitedD[i])
{
DFS(G, i);
}
}
}
}
void DFSTraverse(ALGraph G)
{
cout<<"DFS result :"<<endl;
for(int v=0;v<G.vexnum;++v)
visitedD[v]= false;
for (int i = 0; i < G.vexnum; ++i) {
if(!visitedD[i])
{
DFS(G,i);
}
}
}
void printG(ALGraph G)
{
ArcNode *q;
for(int i=0;i<G.vexnum;i++)
{
cout<<"与"<<G.vertices[i].data<<"相连的顶点 : ";
q=G.vertices[i].first;
while(q!=NULL){
cout<<G.vertices[q->adjvex].data<<" ";
q=q->next;
}
cout<<endl;
}
}
int main(){
ALGraph G;
MGraph(G);
InitGraph(G);
BFSTraverse(G);
DFSTraverse(G);
printG(G);
cout<<endl;
return 0;
}
//测试用例
// 5 5 , abcde , ab ac ad cd ce
// 6 7 , abcdef , ab ac af bd be bf df
// 6 9 , abcdef , ab ad ae bc be bf cf de ef
主要参考: 《数据结构考研复习指导》(王道)