c语言验证完成排序算法的时间,第十三周项目五 拓扑排序算法验证

/*

* Copyright (c) 2015, 烟台大学计算机与控制工程学院

* All rights reserved.

* 文件名称: main.cpp,graph.h,graph.cpp

* 作者:巩凯强

* 完成日期:2015年11月28日

* 版本号:codeblocks

*

* 问题描述: 拓扑排序

* 输入描述: 无

* 程序输出: 见运行结果

*/

#include

#include

#define MAXV 100 //最大顶点个数

#define INF 32767 //INF表示∞

#define MaxSize 100

typedef struct

{

int u; //边的起始顶点

int v; //边的终止顶点

int w; //边的权值

} Edge;

typedef int InfoType;

//以下定义邻接矩阵类型

typedef struct

{

int no; //顶点编号

InfoType info; //顶点其他信息,在此存放带权图权值

} VertexType; //顶点类型

typedef struct //图的定义

{

int edges[MAXV][MAXV]; //邻接矩阵

int n,e; //顶点数,弧数

VertexType vexs[MAXV]; //存放顶点信息

} MGraph; //图的邻接矩阵类型

//以下定义邻接表类型

typedef struct ANode //弧的结点结构类型

{

int adjvex; //该弧的终点位置

struct ANode *nextarc; //指向下一条弧的指针

InfoType info; //该弧的相关信息,这里用于存放权值

} ArcNode;

typedef int Vertex;

typedef struct Vnode //邻接表头结点的类型

{

Vertex data; //顶点信息

int count; //存放顶点入度,只在拓扑排序中用

ArcNode *firstarc; //指向第一条弧

} VNode;

typedef VNode AdjList[MAXV]; //AdjList是邻接表类型

typedef struct

{

AdjList adjlist; //邻接表

int n,e; //图中顶点数n和边数e

} ALGraph; //图的邻接表类型

//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图

//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)

// n - 矩阵的阶数

// g - 要构造出来的邻接矩阵数据结构

void ArrayToList(int *Arr, int n, ALGraph *&G);

void TopSort(ALGraph *G);

void DispAdj(ALGraph *G);

#include "graph.h"

void ArrayToList(int *Arr, int n, ALGraph *&G)

{

int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数

ArcNode *p;

G=(ALGraph *)malloc(sizeof(ALGraph));

G->n=n;

for (i=0; i

G->adjlist[i].firstarc=NULL;

for (i=0; i

for (j=n-1; j>=0; j--)

if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]

{

p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p

p->adjvex=j;

p->info=Arr[i*n+j];

p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p

G->adjlist[i].firstarc=p;

}

G->e=count;

}

void DispAdj(ALGraph *G)

//输出邻接表G

{

int i;

ArcNode *p;

for (i=0; in; i++)

{

p=G->adjlist[i].firstarc;

printf("%3d: ",i);

while (p!=NULL)

{

printf("-->%d/%d ",p->adjvex,p->info);

p=p->nextarc;

}

printf("\n");

}

}

void TopSort(ALGraph *G)

{

int i,j;

int St[MAXV],top=-1; //栈St的指针为top

ArcNode *p;

for (i=0; in; i++) //入度置初值0

G->adjlist[i].count=0;

for (i=0; in; i++) //求所有顶点的入度

{

p=G->adjlist[i].firstarc;

while (p!=NULL)

{

G->adjlist[p->adjvex].count++;

p=p->nextarc;

}

}

for (i=0; in; i++)

if (G->adjlist[i].count==0) //入度为0的顶点进栈

{

top++;

St[top]=i;

}

while (top>-1) //栈不为空时循环

{

i=St[top];

top--; //出栈

printf("%d ",i); //输出顶点

p=G->adjlist[i].firstarc; //找第一个相邻顶点

while (p!=NULL)

{

j=p->adjvex;

G->adjlist[j].count--;

if (G->adjlist[j].count==0)//入度为0的相邻顶点进栈

{

top++;

St[top]=j;

}

p=p->nextarc; //找下一个相邻顶点

}

}

}

#include "graph.h"

int main()

{

ALGraph *G;

int A[7][7]=

{

{0,0,1,0,0,0,0},

{0,0,0,1,1,0,1},

{0,0,0,1,0,0,0},

{0,0,0,0,1,1,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,1,0}

};

ArrayToList(A[0], 7, G);

DispAdj(G);

printf("\n");

printf("拓扑序列:");

TopSort(G);

printf("\n");

return 0;

}

运行结果:

0818b9ca8b590ca3270a3433284dd417.png

知识点总结:

(1)从有向图中选择一个没有前驱(即入度为零)的顶点并且输出它。

(2)从图中删去该顶点,并且删去从该定点出发的全部有向边。

(3)重复上述两步,直到图中不再存在没有前驱的顶点为止。

学习心得:

同样也是根据算法在纸上画一画,跟着Debug调试一步一步的往下走,主要的是理解原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值