IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 本科课程【数据结构与算法】实验8 - 拓扑排序 -> 正文阅读

[数据结构与算法]本科课程【数据结构与算法】实验8 - 拓扑排序

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

  1. 掌握图的邻接矩阵存储结构
  2. 实现图的拓扑排序操作

二、 实验内容

1. 实验任务

输入图的节点信息,构造邻接表并输出邻接表和排序

2. 程序设计

1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
图的顶点数据(data)char字符型;
图的边关系(v1,v2)int 整型;
各边的权值(w)int 整型

2) 数据存储(输入数据在内存中的存储)
邻接表旳形式存储数据

3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
①在有向图中选一个没有前驱的顶点且把它输出
②从图中删除该顶点和所有以它为尾的弧
③重复上述两步,直至全部顶点都输出,或者当图中不存在无前驱的顶点为止

4) 数据输出
在这里插入图片描述

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:VC++ 2013
  3. 实验设备:PC

源代码(C++实现)


#include<iostream>

using namespace std;

#define m 100
#define n 6
#define e 8

struct {
	int s[n];
	int top;
} stack;

typedef struct node1 
{
	int info;                            //这个域就是本节点在数组中的位置
	int adjvertex;  
	char data;                       
	struct node1 *nextarc;
} glinklistnode;                       //这个是在后面邻接的节点

typedef struct node2 {
	int vertexinfo;
	glinklistnode *firstarc;
} glinkheadnode;                             //邻接表的数组,vertexinfo存的是每个点的入度


//创建邻接链表
void createAdjlist(glinkheadnode g[]) 
{
	int i, j, k;
	glinklistnode *p;
	for (i = 0; i<n; i++) 
	{
		g[i].vertexinfo = i;
		g[i].firstarc = 0;
	}//初始化每个节点在数组中的位置
	cout << "输入边节点关系:" << endl;
	for (k = 0; k<e; k++) 
	{
		cin >> i >> j;
		p = (glinklistnode *)malloc(sizeof(glinklistnode));
		p->adjvertex = j;
		p->nextarc = g[i].firstarc;//使用的插入方式建立,后来的更接近根节点
		g[i].firstarc = p;//第一个邻接点是p

	}
}

//拓扑排序函数
void toposort(glinkheadnode g[]) {
	int i, v, w, sum = 0, indegree[n];
	glinklistnode *p;
	for (i = 0; i < n; i++)
	{
		indegree[i] = 0;//初始化indegree数组,完全可以使用memset
	}
	for (i = 0; i < n; i++)
	{
		for (p = g[i].firstarc; p != 0; p = p->nextarc) //这一层for循环用来统计
			indegree[p->adjvertex]++;//经过两个for循环,即可把所有节点的入度算统计出来
	}
	for (i = 0, stack.top = -1; i < n; i++)
	{
		if (indegree[i] == 0)
		{
			stack.top++;
			stack.s[stack.top] = i;
		}//这个for循环用来入栈入度为0的节点
	}
	while (stack.top != -1) 
	{
		cout << stack.s[stack.top]+1 << " ";
		sum = sum + 1;
		v = stack.s[stack.top];
		stack.top = stack.top - 1;//出栈top
		p = g[v].firstarc;//读取该节点的第一个邻接点
		while (p != 0) //遍历p的所有邻接点
		{
			w = p->adjvertex;
			indegree[w] = indegree[w] - 1;//因为前导节点会被删掉,因此它的入度值需要-1
			if (indegree[w] == 0) //如果它的入度等于0,就将这个节点也入栈
			{
				stack.top = stack.top + 1;
				stack.s[stack.top] = w;
			}
			p = p->nextarc;//往下走
		}
	}
	cout << endl;
	if (sum < n)
	{
		cout << "存在回路" << endl;
	}
}

int main() {
	glinkheadnode g[m];
	createAdjlist(g);
	toposort(g);
	system("pause");
	return 0;
}

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:36:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:48:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码