图结构
文件Graph.h
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include <iostream>
#include <cstdlib>
using namespace std;
//链表结构
typedef struct ListNode {
int index;
struct ListNode *next;
}ListNode;
//顶点结构
typedef struct Vertex{
ListNode *firstvex;
char data;
}Vertex;
//图结构
typedef struct Graph{
Vertex vertex[256];
int vexnum , edgenum;
}Graph;
void Init(Graph &G);
void Create_Graph(Graph &G);
void DFSTraverse(Graph G , char x , char y);
void DFS(Graph G , int index , char y);
void Init(Graph &G){
G.edgenum = 0;
G.vexnum = 0;
}
void Create_Graph(Graph &G){
cout << "请输入顶点数:" ;
cin >> G.vexnum;
cout << "请输入边数:";
cin >> G.edgenum;
int i , j , k;
//第0号位置不用,输入顶点
for (i = 1 ; i <= G.vexnum ; i++){
cout << "第" << i << "个顶点为:";
cin >> G.vertex[i].data;
G.vertex[i].firstvex = NULL;
}
//输入边
for(int k = 0 ; k < G.edgenum ; k++){
cout << "请输入边(vi , vj)的下标i,j:";
cin >> i >> j;
//构造边即将顶点下标存入链结构中
//前插法,尾插法需要遍历好麻烦
ListNode *e = new ListNode;
e->index = j;
e->next = G.vertex[i].firstvex;
G.vertex[i].firstvex = e;
e = new ListNode;
e->index = i;
e->next = G.vertex[j].firstvex;
G.vertex[j].firstvex = e;
}
}
//是否访问的标志
int visited[256];
//用于存放途径的点
char str[128];
//给str用的
int pos = 0;
void DFSTraverse(Graph G , char x , char y){
int i;
//第0个位置不用,置零代表未访问
for(i = 1 ; i <= G.vexnum ; i++){
visited[i] = 0;
}
//用于存放起点的下标
int index;
for(i = 1 ; i <= G.vexnum ; i++){
if(G.vertex[i].data == x){
index = i;
break;
}
}
DFS(G , index , y);
}
void DFS(Graph G , int index , char y){
visited[index] = 1;
//将起点放入str
str[pos++] = G.vertex[index].data;
//w指向顶点相邻的第一个元素
ListNode *w = G.vertex[index].firstvex;
while(w)
{
if(visited[w->index] == 0)
{
//如果找到了终点就输出打印str
if(G.vertex[w->index].data == y){
str[pos++] = y;
cout << str << endl;
//程序停止不然会递归回溯
exit(0);
}
//递归遍历相邻点的一个相邻点
//一直往下找,一条路走到黑
DFS(G , w->index , y) ;
}
//已经被访问过了就访问顶点的下一个相邻点
w = w->next ;
}
//如果一条路径找到最后都没找到终点就将顶点从
//str中删除
if(G.vertex[w->index].data != y){
str[--pos] = '\0';
}
}
void SimplePath(Graph G){
char x , y;
cout << "请输入你需要查找简单路径的两顶点:";
cin >> x >> y;
DFSTraverse(G , x , y);
}
#endif // GRAPH_H_INCLUDED
文件main.cpp
#include <iostream>
#include "Graph.h"
using namespace std;
int main()
{
Graph G;
Init(G);
Create_Graph(G);
SimplePath(G);
}