拓扑排序 代码 C语言

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* 用邻接表表示图的拓扑排序算法*/
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define TRUE 1
#define FALSE 0
typedef struct EdgeNode EdgeNode;
typedef struct EdgeNode * PEdgeNode;
typedef struct EdgeNode * EdgeList;
struct EdgeNode
{
int endvex; /* 相邻顶点字段 */
PEdgeNode nextedge; /* 链字段 */
}; /* 边表中的结点 */
typedef struct
{
/*VexType vertex;*/ /* 顶点信息 */
EdgeList edgelist; /* 边表头指针 */
} VexNode; /* 顶点表中的结点 */
typedef struct
{
int n; /* 图的顶点个数 */
VexNode vexs[MAXVEX];
} GraphList;
typedef struct
{
int vexsno[MAXVEX]; /* 顶点在顶点表中的下标值 */ /*VexType vexs[MAXVEX];*/ /* 顶点信息 */
} Topo;
/* 求出图中所有顶点的入度 */
/* 方法是搜索整个邻接表 */
void findInDegree(GraphList* g, int *inDegree)
{
int i; PEdgeNode p;
for (i = 0; i < g->n; i++)
inDegree[i] = 0;
for (i = 0; i < g->n; i++)
{
p = g->vexs[i].edgelist;
while (p)
{
++inDegree[p->endvex];
p = p->nextedge;
}
}
}
int topoSort(GraphList * paov, Topo * ptopo)
{
EdgeList p;
int i, j,k, nodeno = 0, top = -1;
int indegree[MAXVEX];
findInDegree(paov, indegree); /* 求出图中所有顶点的入度 */
for (i = 0; i < paov->n; i++)
if (indegree[i] == 0)
{ /* 将入度为零的顶点入栈 */
indegree[i] = top;
top = i;
}
while (top != -1)
{ /* 栈不为空 */
j = top;
top = indegree[top]; /* 取出当前栈顶元素 */
ptopo->vexsno[nodeno++] = j;
p = paov->vexs[j].edgelist; /* 取该元素边表中的第一个边结点 */ while (p)
{ /* 删除以该顶点为起点的边 */
k = p->endvex;
indegree[k]--;
if (indegree[k] == 0)
{ /* 将新的入度为零的边入栈 */
indegree[k] = top;
top = k;
}
p = p->nextedge;
}
}
if (nodeno < paov->n)
{ /* AOV网中存在回路 */
printf("The aov network has a cycle\n");
return FALSE;
}
return TRUE;
}
/* 边的插入算法*/
void insert(GraphList* p,int a,int b)
{
EdgeList pp;
PEdgeNode temp;
temp = (PEdgeNode)malloc(sizeof(EdgeNode)); temp->endvex = b;
temp->nextedge = NULL;
pp = p->vexs[a].edgelist;
if (pp == NULL)
p->vexs[a].edgelist = temp;
else
{
while (pp->nextedge != NULL)
pp = pp->nextedge;
pp->nextedge = temp;
}
}
/* 实例邻接表的构造 */
GraphList * makeList()
{
GraphList* p;
int i;
p = (GraphList*)malloc(sizeof(GraphList)); p->n = 9;
for (i = 0; i < p->n; i++)
p->vexs[i].edgelist = NULL;
insert(p, 0, 2);
insert(p, 0, 7);
insert(p, 1, 2);
insert(p, 1, 3);
insert(p, 1, 4);
insert(p, 2, 3);
insert(p, 3, 5);
insert(p, 3, 6);
insert(p, 4, 5);
insert(p, 7, 8);
insert(p, 8, 6);
return p;
}
void main()
{
GraphList *p;
Topo topo;
int i;
p = makeList();
if (topoSort(p, &topo) == TRUE)
{
printf("邻接表表示图的拓扑排序结果如下:\n"); for (i = 0; i < p->n; i++)
printf("%d ", topo.vexsno[i]);
}
printf("\n");
}
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求。

相关文档
最新文档