声明:本代码仅供参考,根本就不是正确代码(至少在我看来,有很多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. HDU 4522

    DIJK,最短路,建两个图就好了. #include <cstdlib> #include <cstdio> #include <cstring> #include ...

  2. Unity3D中的Coroutine具体解释

    本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...

  3. UVA LIVE 7146 Defeat the Enemy

    这个题跟codeforces 556 D Case of Fugitive思路一样 关于codeforces 556 D Case of Fugitive的做法的链接http://blog.csdn. ...

  4. 一句话实现Mysql查询结果带行号

    SELECT @rowno:=@rowno + 1 AS rowno,a.* FROM tableName a,(SELECT @rowno:=0) b

  5. poj 2288 Islands and Bridges ——状压DP

    题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...

  6. 74.资金管理-员工工资配置 extjs 页面

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...

  7. 2015 多校赛 第四场 1009 (hdu 5335)

    Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit) ...

  8. ACM_鸡兔同笼(二元一次方程)

    鸡兔同笼 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今有雉兔同笼,上有n头,下有m足,问雉兔各几何? Input: 输入有多 ...

  9. easyui验证提示框 卡在屏幕上!!

    场景:验证提示框,关闭diglog窗口后 还显示在页面中 解决方法: 在窗口关闭事件中,删除提示框(这貌似并不可行),只能将验证提示框隐藏起来. $('#dialog').dialog({ onClo ...

  10. Hibernate基础(二)

    Hibernate中的实体规则 创建实体类注意事项: 1.持久化类提供无参构造函数 2.成员变量私有 提供共有get set 方法 3.属性应尽量使用包装类 Integer.Float.Double等 ...