第三次上机实验报告
作业题目1、2:
实现以下算法:
根据输入(窗口或文件输入),构建邻接矩阵和邻接表;并且实现图的深度优先和广度优先遍历。
运行结果截图:
主要问题:创建图和输入图的顺序控制问题
解决办法:按邻接表方式进行创建,然后按次序输入图,最后输出DFS和BFS
代码:
第一、二题.cpp
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
const int max_n = 100;
bool visited[max_n];//标记数组
queue<int>q;
typedef struct ArcNode { //边节点
int adjvex; //存放序号
struct ArcNode* nextarc; //指向下一个节点的指针
}ArcNode;
typedef struct VNode {//头节点
int data; //数据值
ArcNode* firstarc; //指向相邻边的指针
}AdjList[max_n];
typedef struct {
AdjList vertices;
int vexnum, arcnum;//图
}ALGraph;
int LocateVex(ALGraph G, int v) { //找到节点在图中存的下表并返回
for (int i = 0; i < G.vexnum; ++i) {
if (G.vertices[i].data == v)
return i;
}
}
void CreatDgraph(ALGraph& G) {//创建图
ArcNode* p1;
ArcNode* p2;
cout << "请输入顶点数和边数:" << endl;
cin >> G.vexnum >> G.arcnum;//输入点的个数和边的个数
cout << "请分别输入顶点:" << endl;
for (int i = 0; i < G.vexnum; ++i) {
cin >> G.vertices[i].data;//输入数据值
G.vertices[i].firstarc = NULL;//初始化为NULL
}
int v1, v2;
cout << "请分别输入每一条边的相连顶点:" << endl;
for (int k = 0; k < G.arcnum; ++k) {
cin >> v1 >> v2; //输入边的相邻两个点
int i, j;
i = LocateVex(G, v1);//找到两个点的下标
j = LocateVex(G, v2);
p1 = new ArcNode;
p2 = new ArcNode;//新建边节点
p1->adjvex = j;
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc =