前言
为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!
一、实验内容
第190页第三题第二小题
一个连通图采用邻接表作为存储结构,设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程。
第190页第三题第五小题
采用邻接表存储结构,编写一个算法,判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径。
二、实验环境
Dev C++或Visual Studio 2019
三、实验目的
1.通过建立邻接矩阵与邻接表,掌握图的建立方式
2.建立相关函数,掌握图的遍历方式
通过邻接矩阵与邻接表进行判断、输出等操作
四、算法设计
void DFS(M* G, int v)
{
arc* st[35];
for (int i = 0; i < G->a; i++)
visited[i] = 0;
arc* p = G->v[v].farc;
int top = 0;
st[top] = p;
while (top > -1) {
cout << p->peak << " ";
visited[p->peak] = 1;
p = st[top];
top--;
p = G->v[p->peak].farc;
while (p != NULL) {
if (visited[p->peak] == 0) {
top++;
st[top] = p;
break;
}
else
p = p->nextarc;
}
}
cout << endl;
num find(M G, int x, int y, int k, int visited[], int path[], int d)
{
int n, i;
arc* p;
visited[x] = 1;
d++;
path[d] = x;
if (x == y && d == k) return 1;
p = G.v[x].farc;
while (p != NULL)
{
n = p->peak;
if (visited[n] == 0)
{
if ((i = find(G, n, y, k, visited, path, d)) == 1)
return i;
}
p = p->nextarc;
}
visited[x] = 0;
d--;
return 0;
}
五、实验代码
#include<iostream>
#define MAX 80
using namespace std;
typedef int num;
num path[MAX];
num visited[MAX];
typedef struct arc
{
int peak;
struct arc* nextarc;
}arc;
typedef struct head
{
int data;
arc* farc;
}VNode, List[MAX];
typedef struct
{
List v;
int a, b;
}M;
num LocateVex(M G, int v) {
for (int i = 0; i < G.a; i++) {
if (v == G.v[i].data)return i;
}
}
void CreateUDG(M& G)
{
arc* p, * q;
int i, j, k;
int v1[] = { 1,1,2,2,3,4 };
int v2[] = { 2,4,3,5,4,5 };
G.a = 5;
G.b = 6;
int a[] = { 1,2,3,4,5 };
for (i = 0; i < G.a; i++) {
G.v[i].data = a[i];
G.v[i].farc = NULL;
}
for (k = 0; k < G.b; k++) {
i = LocateVex(G, v1[k]);
j = LocateVex(G, v2[k]);
p = (arc*)malloc(sizeof(arc));
p->peak = j;
p->nextarc = NULL;
p->nextarc = G.v[i].farc;
G.v[i].farc = p;
q = (arc*)malloc(sizeof(arc));
q->peak = i; q->nextarc = NULL;
q->nextarc = G.v[j].farc;
G.v[j].farc = q;
}
}
void DFS(M* G, int v)
{
arc* st[35];
for (int i = 0; i < G->a; i++)
visited[i] = 0;
arc* p = G->v[v].farc;
int top = 0;
st[top] = p;
while (top > -1) {
cout << p->peak << " ";
visited[p->peak] = 1;
p = st[top];
top--;
p = G->v[p->peak].farc;
while (p != NULL) {
if (visited[p->peak] == 0) {
top++;
st[top] = p;
break;
}
else
p = p->nextarc;
}
}
cout << endl;
}
int main()
{
M G;
CreateUDG(G);
int v = 0;
DFS(&G, v);
return 0;
}
#include<iostream>
#define MAX 80
using namespace std;
typedef struct arc
{
int peak;
struct arc* nextarc;
} arc;
typedef struct head
{
char data;
arc* farc;
} VNode, List[MAX];
typedef struct {
List v;
int a, b;
}M;
typedef int num;
num path[MAX];
num visited[MAX];
num f(M G, char v)
{
int i;
for (i = 0; i < G.a; i++)
{
if (G.v[i].data == v)return i;
}
return -1;
}
char ret(M G, int i)
{
return (i >= 0 && i < G.a) ? G.v[i].data : NULL;
}
num linein(M G, char m)
{
int z;
for (z = 0; z < G.a; z++)
{
if (G.v[z].data == m)return z;
}
return -1;
}
num find(M G, int x, int y, int k, int visited[], int path[], int d)
{
int n, i;
arc* p;
visited[x] = 1;
d++;
path[d] = x;
if (x == y && d == k) return 1;
p = G.v[x].farc;
while (p != NULL)
{
n = p->peak;
if (visited[n] == 0)
{
if ((i = find(G, n, y, k, visited, path, d)) == 1)
return i;
}
p = p->nextarc;
}
visited[x] = 0;
d--;
return 0;
}
void createmap(M& G)
{
num i, k;
char m, n;
arc* s;
G.a = 6;//points 6 arc 5
G.b = 5;
if (G.a > 80 || G.b > ((G.a - 1) * G.a / 2))//Test input validity
{
cout << "ERROR!" << endl;
}
for (i = 0; i < G.a; i++)//the name of those points are ABCDEF
{
G.v[i].data = 65 + i;
G.v[i].farc = NULL;
}
for (k = 0; k < G.b; k++)
{
if (k == 0) { m = 'A'; n = 'B'; }
if (k == 1) { m = 'A'; n = 'C'; }
if (k == 2) { m = 'D'; n = 'B'; }
if (k == 3) { m = 'B'; n = 'E'; }
if (k == 4) { m = 'C'; n = 'F'; }
int p, q;
p = linein(G, m); q = linein(G, n);
int a, b;
a = f(G, m);
b = f(G, n);
s = (arc*)malloc(sizeof(arc));
s->peak = a;
s->nextarc = G.v[b].farc;
G.v[b].farc = s;
s = (arc*)malloc(sizeof(arc));
s->peak= b;
s->nextarc = G.v[a].farc;
G.v[a].farc = s;
}
}
int main()
{
for (int i = 0; i < MAX; i++)
{
visited[i] = 0;
}
M G;
createmap(G);
char r='D', e='F';//find point=D-B-A-C-F
int t=4;//find length=4;
cout << "path " << r << "->" << "F with length=" << t << endl;
if(linein(G, r) == -1 || linein(G, e) == -1)//check
{
cout <<"ERROR" << endl;
return 0;
}
if (find(G, f(G, r), f(G, e), t, visited, path, -1))
{
int q;
cout << "this path exist!" << endl;
for (q = 0; q < t; q++)
cout << ret(G, path[q]) << "-";
cout << e << endl;
}
else { cout << "this path do not exist!" << endl; return 0; }
return 0;
}
六、实验结果截图
输入:AB AC BD BE CF
寻找:D->F 步长为4的路径
七、实验分析(选做)
时间复杂度:O(n^2)
空间复杂度:O(n)