声明:本代码仅供参考,根本就不是正确代码(至少在我看来,有很多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 = 20;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 = 0; }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 = 0; i < true_size; i++){cout << "请输入连接" << root[i].address->data << "结点的个数:";cin >> contact_number;cout << "请分别输入连接的结点的名称:" << endl;for (int j = 0; 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 == -1){//错误
            }add->next = NULL;end->next = add;}}
}
int Graph::search(char goal)//-1为查找失败
{int result = -1;for (int i = 0; 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 = 0; 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!= -1){cout << "元素已经存在在图中,请输入添加连接的个数:" << endl;int number;cin >> number;for (int j = 0; 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 == -1){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 = 0; 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 == -1){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 = 0; 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 0;}

请输入图中结点个数:4
请输入结点名称并继续:
A B C D
图初始化完毕!
请分别输入这4个元素的连接结点:
请输入连接A结点的个数:1
请分别输入连接的结点的名称:
C
请输入连接B结点的个数:1
请分别输入连接的结点的名称:
D
请输入连接C结点的个数:1
请分别输入连接的结点的名称:
A
请输入连接D结点的个数:1
请分别输入连接的结点的名称:
B
请输入要添加的元素:
A
元素已经存在在图中,请输入添加连接的个数:
1
B
A已经成功添加!
结点:A连接的结点为:
C B
结点:B连接的结点为:
D
结点:C连接的结点为:
A
结点:D连接的结点为:
B
请输入开始访问的结点:
A
A C B D 请按任意键继续. . .

测试结果

注意:已知BUG,如果在输入元素连接结点的时候,请注意输入顺序,尽量从下往上输入,否则会造成DFS遍历失败···

转载于:https://www.cnblogs.com/robotpaul/p/10048584.html

【数据结构】4.1图的创建及DFS深度遍历(不完善)相关推荐

  1. java数据结构和算法——图的深度优先(DFS)遍历

    目录 一.图的遍历介绍 二.图的深度优先搜索(Depth First Search) 三.图的深度优先遍历算法步骤 四.图的深度优先遍历示例需求 五.图的深度优先遍历代码示例 一.图的遍历介绍 所谓图 ...

  2. js数据结构与算法 图的BFS和DFS

    本文为技术学习的笔记-<Learning JavaScript Data Structures and Algorithms, Third Edition> 1.图的相关术语 图是网络结构 ...

  3. java数据结构和算法——图的广度优先(BFS)遍历

    目录 一.图的遍历介绍 二.图的广度优先搜索(Broad First Search) 三.图的广度优先遍历算法步骤 四.图的广度优先遍历示例需求 五.图的广度优先遍历代码示例 一.图的遍历介绍 所谓图 ...

  4. 数据结构实验六 图的综合应用

    实验六  图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1  ...

  5. 数据结构——图的创建以及遍历

    第十二章 图 12.1 图的基本介绍 ​ 图是一种数据结构,其中节点可以具有零个或多个相邻元素.两个节点之间的连接称为边.节点也可以称为顶点 为什么要有图 前面我们学习了线性表和树 线性表局限于一个直 ...

  6. 数据结构之图的创建(邻接表)

    数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解. 邻接无向图 1. 邻接表无向图介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D, ...

  7. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  8. 数据结构实验之图论二:图的深度遍历(DFS)

    Description 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编号小的. Input 输入第一行为整数n(0 < n < 100), ...

  9. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

最新文章

  1. Topcoder SRM 657DIV2
  2. 指针-数组传参,指针传参
  3. linux目录表及功能n鸟哥,鸟哥linux学习之-资料与目录管理
  4. js温故而知新11(AJAX)——学习廖雪峰的js教程
  5. 金融云 > 产品常见问题 > 金融云VPC端口限制
  6. python列表和数组区别java_Python列表与Java数组效率
  7. 多媒体计算机辅助英语教学,多媒体计算机辅助小学英语教学探讨
  8. Flurry、友盟、TalkingData移动应用统计分析对比
  9. R绘图笔记 | 生存曲线的绘制
  10. 邮件服务器匿名,ProtonMail最安全且匿名邮箱免费服务
  11. Android性能优化系列-监听View inflate周期并动态替换
  12. 百度地图API js详细介绍
  13. 安全好用的智能头盔,自带灯光提示与语音功能,力沃BH51M Neo体验
  14. 【黄啊码】thinkphp sql wherein的排序问题|tp不能按whereIn排序?
  15. c++ placement new
  16. 钉钉实时拍照和上传图片
  17. 未来 5 年的 5 大技术趋势
  18. 人均年薪50万以上,docker到底是什么?为什么这么火?
  19. 抖音电商魏雯雯:深耕全域兴趣电商 丰富用户美好生活
  20. XP系统中IIS问题解决与下载

热门文章

  1. python的实例属性_python 实例属性和类属性
  2. hadoop hdfs 集群配置
  3. Pandas GroupBy对象 索引与迭代
  4. Java基础学习总结(47)——JAVA输入输出流再回忆
  5. Myeclipse学习总结(2)——MyEclipse快捷键大全
  6. mac 黑窗口连接mysql_mac系统下mysql环境变量设置及远程连接
  7. python自动控制库_python PyAUtoGUI库实现自动化控制鼠标键盘
  8. linux文件系统管理实践题目,Linux软件管理、文件系统管理实践
  9. pcb天线和纯铜天线_蓝牙模块采用陶瓷天线和PCB天线的区别
  10. 差分电荷密度 matlab,差分电荷密度