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

#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;								//该结点还有指向其他的弧
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值