【数据结构】4.1图的创建及DFS深度遍历(不完善)
声明:本代码仅供参考,根本就不是正确代码(至少在我看来,有很多BUG和不完美的地方)
图的存储方式选择为邻接表,并且headNode只是来存储一个链表的Node首地址额
总之这个代码写的很垃圾呀很垃圾···水平太低 o(╥﹏╥)o
Graph.h
#include<iostream>
using namespace std;
struct Node { //结点,用来存储图上结点的信息
char data; //结点名称
Node *next;
int loc;//数组下标 };
struct headNode {
Node *address;
bool flag;//标志,默认为false代表没有被访问(访问过就是true防止重复访问 耶我真机智)
};
class Graph {
private:
headNode *root;
const int MAX_SIZE = ;
int true_size;
void initGraph(char data[], int num);
void contact();
int search(char goal);
void dfs_print(int loc);
public:
Graph() { root = NULL; true_size = ; }
Graph(char data[], int num);
void add();
void print_all();
void DFSprint(char item);
};
Graph.cpp
#include"Graph.h"
Graph::Graph(char data[], int num)
{
initGraph(data, num);
cout << "图初始化完毕!" << endl;
contact();
}
void Graph::contact()
{
cout << "请分别输入这" << true_size << "个元素的连接结点:" << endl;
int contact_number;
for (int i = ; i < true_size; i++)
{
cout << "请输入连接" << root[i].address->data << "结点的个数:";
cin >> contact_number;
cout << "请分别输入连接的结点的名称:" << endl;
for (int j = ; j < contact_number;j++)
{
char data;
Node *end = root[i].address;
while (end->next)
{
end = end->next;
}
Node *add = new Node();
cin >> data;
add->data = data;
add->loc = search(data);
if (add->loc == -)
{
//错误
}
add->next = NULL;
end->next = add; }
}
}
int Graph::search(char goal)//-1为查找失败
{
int result = -;
for (int i = ; i < true_size; i++)
{
if (root[i].address->data == goal)
{
result = i;
break;
}
}
return result;
}
void Graph::initGraph(char data[],int num)
{
true_size = num;
root = new headNode[MAX_SIZE];
for (int i = ; i < true_size; i++)
{
root[i].address = new Node();
root[i].address->data = data[i];
root[i].address->loc = i;
root[i].address->next = NULL;
root[i].flag = false;
}
}
void Graph::add()
{ cout << "请输入要添加的元素:" << endl;
char data;
cin >> data;
int loc = search(data);
if (loc!= -)
{
cout << "元素已经存在在图中,请输入添加连接的个数:" << endl;
int number;
cin >> number;
for (int j = ; j < number; j++)
{
char data;
Node *end = root[loc].address;
while (end->next)
{
end = end->next;
}
Node *add = new Node();
cin >> data;
add->data = data;
add->loc = search(data);
if (add->loc == -)
{
cout << "未找到指定元素" << endl;
}
add->next = NULL;
end->next = add;
} }
else
{
if (true_size > MAX_SIZE)
{
cout << "图已经超出最大连接长度,添加失败!" << endl;
return ;
}
true_size++;
root[true_size].address = new Node();
root[true_size].address->data = data;
root[true_size].address->loc = true_size;
root[true_size].address->next = NULL;
}
cout << data << "已经成功添加!" << endl;
}
void Graph::print_all()
{
for (int i = ; i < true_size; i++)
{
cout << "结点:" << root[i].address->data << "连接的结点为:" << endl;
Node *p = root[i].address->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
}
void Graph::dfs_print(int loc)
{
Node *p = root[loc].address;
root[loc].flag = true;
while (p!= NULL)
{
Node *w = p->next;
if ((w!=NULL)&&(root[w->loc].flag == false))
{
cout << w->data << " ";
dfs_print(w->loc);
}
p = p->next;
}
}
void Graph::DFSprint(char item)
{
int loc = search(item);
if (loc == -)
{
cout << "错误,未找到结点!" << endl;
}
else
{
cout << root[loc].address->data << " ";
dfs_print(loc);
}
}
main.cpp
#include"Graph.h"
int main()
{
char *graphNode,select;
int number;
cout << "请输入图中结点个数:";
cin >> number;
graphNode = new char[number];
cout << "请输入结点名称并继续:" << endl;
for (int i = ; i < number; i++)
{
cin >> graphNode[i];
}
Graph test(graphNode, number);
test.add();
test.print_all();
cout << "请输入开始访问的结点:" << endl;
cin >> select;
test.DFSprint(select);
system("pause");
return ; }
请输入图中结点个数:
请输入结点名称并继续:
A B C D
图初始化完毕!
请分别输入这4个元素的连接结点:
请输入连接A结点的个数:
请分别输入连接的结点的名称:
C
请输入连接B结点的个数:
请分别输入连接的结点的名称:
D
请输入连接C结点的个数:
请分别输入连接的结点的名称:
A
请输入连接D结点的个数:
请分别输入连接的结点的名称:
B
请输入要添加的元素:
A
元素已经存在在图中,请输入添加连接的个数: B
A已经成功添加!
结点:A连接的结点为:
C B
结点:B连接的结点为:
D
结点:C连接的结点为:
A
结点:D连接的结点为:
B
请输入开始访问的结点:
A
A C B D 请按任意键继续. . .
测试结果
注意:已知BUG,如果在输入元素连接结点的时候,请注意输入顺序,尽量从下往上输入,否则会造成DFS遍历失败···
【数据结构】4.1图的创建及DFS深度遍历(不完善)的更多相关文章
- 图的创建和遍历(BFS/DFS)
图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )
图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...
- 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)
题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...
- 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...
- JS实现图的创建和遍历
图分为无向图和有向图 图的存储结构有邻接矩阵.邻接表.十字链表.邻接多重表这四种,最常用的是前两种 本篇主要是利用邻接矩阵实现无向图的创建和遍历(深度优先.广度优先),深度优先其实就是二叉树里的前序遍 ...
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1
import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...
- c/c++ 图的创建及图的相关函数(链表法)
c/c++ 图的创建及图的相关函数(链表法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点 ...
随机推荐
- HDU 5288
//枚举因子,查找和i最近的左右是i因子的点即可. #include <iostream> #include <cstdio> #include <algorithm&g ...
- GPS-Graph Processing System 改动源代码经验总结 (四)
HamaWhite原创,转载请注明出处.欢迎大家增加Giraph 技术交流群: 228591158 本文目的:在改动GPS源代码后,具体描写叙述怎样编译和分发到各Worker节点上. 以下以Graph ...
- Thrift源代码分析(八)--总结加一个完整的可执行的Thrift样例
前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解. Thrift源代码分析(一)-- 基本概念 Thrift源代码分析(二)-- 协议和编解码 Thrift源代码分 ...
- clCreateCommandQueue': was declared deprecated
今天在配置opencl的开发环境.測试用例时,用的是intel的sdk开发包.遇到了这个问题: clCreateCommandQueue': was declared deprecated 也就是说这 ...
- thymeleaf+springboot找不到html,只返回了字符串
在浏览器用链接http://localhost:8080/city/page/list 访问时页面上只出现了cityList字样,预期是返回cityList.html 解决:在controller中使 ...
- ACM Amman Collegiate Programming Contest(7.22随机组队娱乐赛)
题目链接 https://vjudge.net/contest/240074#overview 只写一下自己做的几个题吧 /* D n^2的暴力dp怎么搞都可以的 这里先预处理 i到j的串时候合法 转 ...
- [RK3288][Android6.0] 调试笔记 --- 普通串口的添加 【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/54574073 标签: rk3288 串口添加 2017-01-16 14:52 1079 ...
- hdu 1213(并查集模版题)
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Django day06 模版层(二) 过滤器 标签
一: 模板语言之过滤器: " | " 前后的区分: 前面的是函数的第一个参数, 后面的是python的一个函数, 冒号后面的是第二个参数例: <p>过滤器之默认值:{ ...
- MSSQL:删除系统作业计划
use [msdb]declare @job_name varchar(100)set @job_name = N'EveryDayBackup.Subplan_1'--注:jobName为维护计划对 ...