#include<iostream>
#include<time.h>
#include<Windows.h>
#include< queue>
using namespace std;
#define NUM 100
#pragma warning(disable:4996)
typedef struct link
{
int index;
struct link *next;
}*Node,node;
typedef struct Link
{
char word;
Node first;
}*Head,head;
typedef struct g
{
head linktable[NUM];
int n, e;
}*Map,map;
void Allocatemap(Map &G);//给图指针分配一块图的专属区域
void Parmmap(Map G);//传入邻接表参数
void Createmap(Map G);//创建邻接表表头
int Locatev(Map G, char x);//确定关系顶点的位置
void Relatemap(Map G);//创建图的关系链
void Printmap(Map G);//打印图的邻接表
void SingleDepthsearch(Map G, int n,int visited[]);//从邻接表的一个表头进行深入搜索,直到这个表头遍历完成
void Depthsearch(Map G, int visited[]);//遍历所有邻接表表头,并以此进行深度搜索
void SingleWidesearch(Map G, int n,int visited[]);//从邻接表的一个表头进行广度搜索,直到这个表头遍历完成
void Widespread(Map G, int visited[]);//遍历所有邻接表表头,并以此进行广度搜索
int main()
{
int Visited[NUM] = { 0 };
int visited[NUM] = { 0 };
Map G;
Allocatemap(G);
Parmmap(G);
Createmap(G);
Relatemap(G);
Printmap(G);
Depthsearch(G, visited);
Widespread(G,Visited);
return 0;
}
void Allocatemap(Map &G)//给图指针分配一块图的专属区域
{
G = new map;
}
void Parmmap(Map G)//传入邻接表参数
{
cout << "请输入图的基本参数,即图的顶点数和边数:";
cin >> G->n;
cin >> G->e;
}
void Createmap(Map G)//创建邻接表表头
{
char a[NUM];
cout << "请输入顶点的具体数据:";
cin >> a;
for (int i = 0; i < G->n; i++)
{
G->linktable[i].word = a[i];
G->linktable[i].first = NULL;
}
}
int Locatev(Map G, char x)//确定关系顶点的位置
{
int i;
for (i = 0; i < G->n; i++)
{
if (G->linktable[i].word == x) return i;
}
return -1;
}
void Relatemap(Map G)//创建图的关系链
{
int j = 0, k = 0;
char a, b;
cout << "请输入图的关系:" << endl;
for (int i = 0; i < G->e; i++)
{
cin >> a >> b;
j = Locatev(G, a);
k = Locatev(G, b);
Node p = new node;
p->index = k;
p->next = G->linktable[j].first;
G->linktable[j].first = p;
}
}
void Printmap(Map G)//打印图的邻接表
{
cout << "图的邻接表为:" << endl;
for (int i = 0; i < G->n; i++)
{
Node p = G->linktable[i].first;
cout << G->linktable[i].word << "--->";
while (p)
{
cout << G->linktable[p->index].word;
p = p->next;
if(p)cout<< "-->";
}
cout << endl;
}
}
void SingleDepthsearch(Map G,int n,int visited[])//从邻接表的一个表头进行深入搜索,直到这个表头遍历完成
{
visited[n] = 1;
Node p = G->linktable[n].first;
cout << G->linktable[n].word;
while(p)
{
if(visited[p->index]==0)
SingleDepthsearch(G, p->index,visited);
p = p->next;
}
}
void Depthsearch(Map G,int visited[])//遍历所有邻接表表头,并以此进行深度搜索
{
cout << "深度优先搜索遍历此图的结果为:";
for (int i = 0; i < G->n; i++)
{
if (visited[i] == 0)SingleDepthsearch(G, i, visited);
}
cout << endl;
}
void SingleWidesearch(Map G,int n,int visited[])//从邻接表的一个表头进行广度搜索,直到这个表头遍历完成
{
visited[n] = 1;
queue<int> q;
q.push(n);
cout<< G->linktable[n].word;
while (q.empty()==false)
{
Node p = G->linktable[q.front()].first;
while(p)
{
if (visited[p->index] == 0)
{
cout << G->linktable[p->index].word;
q.push(p->index);
visited[p->index] = 1;
}
p = p->next;
}
q.pop();
}
}
void Widespread(Map G,int visited[])//遍历所有邻接表表头,并以此进行广度搜索
{
cout << "广度优先搜索遍历此图的结果为:";
for (int i = 0; i < G->n; i++)
{
if (visited[i] == 0)SingleWidesearch(G, i, visited);
}
cout << endl;
}
上图左图是有向图演示示例的逻辑结构图,右图是对应图的邻接表
【注】:如果是无向图,在输入图的关系时,只要按照双向输入的标准输入即可,即一条连线表示双向连通
下图是对应代码的运行结果
版权声明:本文为zswsx123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。