博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序之邻接表实验
阅读量:4156 次
发布时间:2019-05-26

本文共 4256 字,大约阅读时间需要 14 分钟。

拓扑排序之邻接表实验

标签:拓扑排序

方法一:

FindInDegree()函数对各个顶点求入度,保存在indegree[]数组中。

#include 
#include
#include
using namespace std;#define M 20typedef char vertextype;int indegree[M];typedef struct node{ int adjvex; struct node *next;}edgenode;typedef struct de{ edgenode *FirstEdge; vertextype vertex;}vertexnode;typedef struct{ vertexnode adjlist[M]; int n,e;}AovGraph;void creat(AovGraph *g, char *filename){ int i, j, k; edgenode *s; FILE *fp; fp = fopen(filename, "r"); if(fp){ fscanf(fp, "%d %d", &g->n, &g->e); for(i = 0; i < g->n; i++){ fscanf(fp, "%1s", &g->adjlist[i].vertex); g->adjlist[i].FirstEdge = NULL; } for(k = 0; k < g->e; k++){ s = (edgenode*)malloc(sizeof(edgenode)); fscanf(fp, "%d %d", &i, &j); s->adjvex = j; s->next = g->adjlist[i].FirstEdge; g->adjlist[i].FirstEdge = s; } }}void FindInDegree(AovGraph g, int indegree[M]){ for(int i = 0; i < g.n; i++){ int total = 0; for(int j = 0; j < g.n; j++){ edgenode *p = g.adjlist[j].FirstEdge; while(p){ if((p->adjvex + '0') == g.adjlist[i].vertex) total++; ///'0' p = p->next; } } indegree[i] = total; }}void print(AovGraph g){ int i; FindInDegree(g, indegree); for(i = 0; i < g.n; i++){ printf("indegree(%d) %c", indegree[i], g.adjlist[i].vertex); edgenode *p = g.adjlist[i].FirstEdge; while(p){ printf("-->%d", p->adjvex); p = p->next; } printf("\n"); }}void Tsort(AovGraph g){ stack
S; int i, k; FindInDegree(g, indegree); for(i = 0; i < g.n; i++) if(!indegree[i]) S.push(g.adjlist[i].vertex - '0'); /// int countv = 0; while(!S.empty()){ i = S.top(), S.pop(); printf("%c", g.adjlist[i].vertex); ++countv; for(edgenode *p = g.adjlist[i].FirstEdge; p; p = p->next){ k = p->adjvex; if(!(--indegree[k])) S.push(k); } } if(countv < g.n) printf("failed\n");}int main(){ AovGraph g; creat(&g, "topo.txt"); print(g), printf("\n"); Tsort(g), printf("\n"); return 0;}

方法二:

在邻接表头结点中增加一个存放顶点入度的域,在读图的同时计算各顶点的入度。

#include 
#include
#include
using namespace std;#define M 20typedef char vertextype;typedef struct node{ int adjvex; struct node *next;}edgenode;typedef struct de{ edgenode *FirstEdge; vertextype vertex; int id; //顶点的入度}vertexnode;typedef struct{ vertexnode adjlist[M]; int n,e;}AovGraph;void creat(AovGraph *g, char *filename){ int i, j, k; edgenode *s; FILE *fp; fp = fopen(filename, "r"); if(fp){ fscanf(fp, "%d %d", &g->n, &g->e); for(i = 0; i < g->n; i++){ fscanf(fp, "%1s", &g->adjlist[i].vertex); g->adjlist[i].FirstEdge = NULL; g->adjlist[i].id = 0; //入度初始化为0 } for(k = 0; k < g->e; k++){ s = (edgenode*)malloc(sizeof(edgenode)); fscanf(fp, "%d %d", &i, &j); s->adjvex = j; g->adjlist[j].id++; //顶点j的入度加1 s->next = g->adjlist[i].FirstEdge; g->adjlist[i].FirstEdge = s; } }}void print(AovGraph g){ int i; for(i = 0; i < g.n; i++){ printf("indegree(%d) %c", g.adjlist[i].id, g.adjlist[i].vertex); edgenode *p = g.adjlist[i].FirstEdge; while(p){ printf("-->%d", p->adjvex); p = p->next; } printf("\n"); }}void Tsort(AovGraph g){ stack
S; int i, k; for(i = 0; i < g.n; i++) if(!g.adjlist[i].id) S.push(g.adjlist[i].vertex - '0'); /// int countv = 0; while(!S.empty()){ i = S.top(), S.pop(); printf("%c", g.adjlist[i].vertex); ++countv; for(edgenode *p = g.adjlist[i].FirstEdge; p; p = p->next){ k = p->adjvex; if(!(--g.adjlist[k].id)) S.push(k); } } if(countv < g.n) printf("failed\n");}int main(){ AovGraph g; creat(&g, "topo.txt"); print(g), printf("\n"); Tsort(g), printf("\n"); return 0;}

数据文件:

input
实验结果:
output

你可能感兴趣的文章
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>