数据结构-图(有向图的十字链表法和深度搜索遍历)
程序员文章站
2022-05-21 08:46:39
...
#pragma once
#include "pch.h"
namespace map {
typedef class map10listarc {
public:
int tail, head;//弧尾节点序号,头节点序号
int info;//权重
map10listarc *h; map10listarc *t;//相同头,尾节点的弧链域
}arc;
typedef class map10listvertex
{
public:
char data;
arc *fin, *fout;//入度 出度
int node;//顶点编号
}ver;
class map10list:public map10listarc ,public map10listvertex{
public:
void init(map10list&);//创建有向图
int locate(map10list&, char );//查找顶点
void DFSv0(map10list&,int);//深度访问第一个顶点
void DFS(map10list&);//深度遍历
private:
ver vertex[max];//向量
bool DFSv[max];
int vernum, arcnum;
};
}
#include "pch.h"
#include "图.h"
#include "队列.h"
using namespace map;
int map10list::locate(map10list &l,char v)
{
int x = 0;
while (l.vertex[x].data != v && x < l.vernum)
{
x++;
}
return x;
}
void map10list::init(map10list&l)
{
cout << "输入有向图的顶点数" << endl;
cin >> l.vernum;
cout << "输入有向图的顶点资料" << endl;
for (int i = 0; i < l.vernum; i++)
{
cin >> l.vertex[i].data;
l.vertex[i].node = i;
l.vertex[i].fin = NULL;
l.vertex[i].fout = NULL;
}
cout << "输入有向图的弧数" << endl;
cin >> l.arcnum;
cout << "输入有向图的弧的资料" << endl;
char vt, vh;//弧的两端顶点
int v1, v2;//两个顶点的标号
for (int i = 0; i < l.arcnum; i++)
{
cout << "输入第" << i << "边的头" << endl;
cin >> vt;
cout << "输入第" << i << "边的尾" << endl;
cin >> vh;
v1 = locate(l, vt);
v2 = locate(l, vh);
arc *a = new arc;
cout << "输入第"<<i<<"边的权值" << endl;
cin >> a->info;//输入权值
a->tail = v1;//弧尾插入
a->head = v2;//弧头插入
a->h = l.vertex[v2].fin;//记录这一次弧头是第一次插入弧头
a->t = l.vertex[v1].fout;
l.vertex[v2].fin = l.vertex[v1].fout = a;
}
};
void map10list::DFS(map10list&l)
{
for (int i = 0; i < l.vernum; i++) //先把每个结点都标记为假,没有访问过
l.DFSv[i] = false;
for (int i = 0; i < l.vernum; i++) {
if (!DFSv[i]) //对没有访问的结点,按深度优先遍历
DFSv0(l, i);
}
};
void map10list::DFSv0(map10list&l,int i)
{
l.DFSv[i] = true;//访问了就标记为真
cout << "顶点的数据是" << l.vertex[i].data<< endl;
arc *DFStemp = l.vertex[i].fout; //用DFStemp来存储该节点的第一个出去的弧
while (DFStemp)
{
if (!DFSv[DFStemp->head]) //访问此结点第一个出去的弧
{
DFSv0(l, DFStemp->head);
}
DFStemp = DFStemp->t; //该结点还有指向其他的弧
}
};
上一篇: 浅析“网页版飞信” 的SEO策略
下一篇: ai怎么设计披萨的logo标志?