欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构-图(有向图的十字链表法和深度搜索遍历)

程序员文章站 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;								//该结点还有指向其他的弧
	}
};