声明:本代码仅供参考,根本就不是正确代码(至少在我看来,有很多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深度遍历(不完善)的更多相关文章

  1. 图的创建和遍历(BFS/DFS)

    图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...

  2. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  3. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  4. 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )

    图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...

  5. 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)

    题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...

  6. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  7. JS实现图的创建和遍历

    图分为无向图和有向图 图的存储结构有邻接矩阵.邻接表.十字链表.邻接多重表这四种,最常用的是前两种 本篇主要是利用邻接矩阵实现无向图的创建和遍历(深度优先.广度优先),深度优先其实就是二叉树里的前序遍 ...

  8. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  9. c/c++ 图的创建及图的相关函数(链表法)

    c/c++ 图的创建及图的相关函数(链表法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点 ...

随机推荐

  1. Window下UDP(socket)接和收数据案例

     配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\ ...

  2. 禁止root用户直接远程telnet/ssh登陆

    AIX 封闭root,只能使用su登录root用户,禁止root用户直接远程登陆. 1.  禁止telnet登录 smit chuser   ->root       ->User can ...

  3. oc65--协议应用1,接口.做数据类型限定

    // WifeCondition.h #import <Foundation/Foundation.h> @protocol WifeCondition <NSObject> ...

  4. Android和H5交互-基础篇

    hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的.Android中是如何和H5交互的? 1.webView加载页面 我们都知道在Android中是通过webV ...

  5. 查看tensorflow pb模型文件的节点信息

    查看tensorflow pb模型文件的节点信息: import tensorflow as tf with tf.Session() as sess: with open('./quantized_ ...

  6. PCB 3D PCB 后续改进与扩展功能一些想法

    再次感受到WelGl实现3D效果的震撼, 一.目前功能: Gerber与钻孔 解析 并转为3D实景图,用户360度操控 二.后续改进扩展功能: 1.增加ODB++解析 2. 3D 尺寸标注(外形尺寸, ...

  7. 记录一下Junit测试MongoDB,获取MongoTemplate

    只是自己记录一下,测试MongoDB帮助类时,没有配置文件的测试 public class HelperTest { MongoTemplate template; @Before public vo ...

  8. centos7安装python3.7和ipython

    一.centos7为刚安装的 1)配置yum源和epel源 采用国内源 查看yum的配置文件 (里面的镜像网址)是否ping的通 全部更改成 国内的 yum .epel源 在图中位置 下载相应的 re ...

  9. POJ 3083 BFS+DFS 40行

    题意:给你一个迷宫. 先输出当左转优先的时候走的路程长度,再输出当右转优先时走的路程长度,最后输出从起点到终点的最短路程长度. 嗯嗯 奴哥活跃气氛的题.随便写了写.. 此题 知道了思路以后就是水题了. ...

  10. hdu 4297

    有两个基础需要掌握: RMQ,以及LCA. RMQ:dp[i][j]表示下标从i开始,长度为2^j的一段元素中的最值.则易得状态转移如下:dp[i][j]=max/min(dp[i][j-1],dp[ ...