c语言拓扑排序算实验报告,拓扑排序C语言

这篇博客介绍了一个拓扑排序的实现,通过使用栈存储节点并跟踪入度,避免了多次函数调用。作者提到,散列在这个实现中并未起到作用,但会尝试实现。文章展示了如何对一个图进行初始化,并进行拓扑排序,最后输出排序后的节点序列。如果在排序过程中栈为空但仍有节点未处理,则说明图中存在环。代码实现清晰,展示了图的遍历和处理过程。
摘要由CSDN通过智能技术生成

这个,主要体现的是思想.问题在一开始就被定义在了一道已知的习题上,所以并没有什么通用性.实现中,如果在栈中存储名字的同时存储索引,那么,将会省去很多次函数调用.而且,散列在我这个实现中也没有发挥作用,我会去实现的.

基本的思路,就是这样,理解得还算不错,哈哈.

可喜可贺的是,好几天没有写代码了.冷不丁一写,成功率出奇地高.和专心程度有关吗?加油吧.留给自己的时间不多了,每一天都要努力!

/*9-3-12-07-20.06.c -- 第九章第三题*/

#include

#include

typedef char Name ;

#include "Stack_ADT.h"

#include "adjacenty_list.h"

#define SIZE 11

int main (void) ;

int get_index (const Adjacent_List * const padj, const Name name) ;

void topological_sort (Adjacent_List * padj, Name * topological) ;

void print_name (const Name vertex) ;

void print_stack (const Stack_Node * const pstack_node) ;

int main (void)

{

Adjacent_List adj ;

int capacity = SIZE, i ;

Name topological[SIZE] ;

CreateAdjacent_List (&adj, capacity) ;

InitializeALineOfAdjacent_List (&adj, 0, 's', 0, 3, 'a', 'd', 'g') ;

InitializeALineOfAdjacent_List (&adj, 1, 'a', 1, 2, 'b', 'e') ;

InitializeALineOfAdjacent_List (&adj, 2, 'b', 1, 1, 'c') ;

InitializeALineOfAdjacent_List (&adj, 3, 'c', 3, 1, 't') ;

InitializeALineOfAdjacent_List (&adj, 4, 'd', 2, 2, 'a', 'e') ;

InitializeALineOfAdjacent_List (&adj, 5, 'e', 4, 3, 'c', 'f', 'i') ;

InitializeALineOfAdjacent_List (&adj, 6, 'f', 2, 2, 'c', 't') ;

InitializeALineOfAdjacent_List (&adj, 7, 'g', 1, 3, 'd', 'e', 'h') ;

InitializeALineOfAdjacent_List (&adj, 8, 'h', 1, 2, 'e', 'i') ;

InitializeALineOfAdjacent_List (&adj, 9, 'i', 2, 2, 'f', 't') ;

InitializeALineOfAdjacent_List (&adj, 10, 't', 3, 0) ;

//PrintAdjacent_List (&adj) ;

topological_sort (&adj, topological) ;

for (i = 0; i < 11; i++)

printf ("%c/n", topological[i]) ;

ReleaseForAdjacent_List (&adj) ;

return 0 ;

}

int get_index (const Adjacent_List * const padj, const Name name)

{

int i, capacity = (*padj) -> capacity ;

for (i = 0; i < capacity; i++)

{

if (name == (*padj) -> list[i].name)

return i ;

}

}

void topological_sort (Adjacent_List * padj, Name * topological)

{

Stack stack ;

int counter = 0, capacity = (*padj) -> capacity, i ;

Vertex * scan ;

Name v ;

InitializeStack (&stack) ;

for (i = 0; i < capacity; i++)

{

if (0 == (*padj) -> indegree[i])

Push (&stack, &(*padj) -> list[i].name) ;

}

while (!StackIsEmpty (&stack))

{

Pop (&stack, &v) ;

topological[counter++] = v ;

scan = (*padj) -> list[get_index (padj, v)].next ;

while (scan)

{

if (0 == --(*padj) -> indegree[get_index (padj, scan -> name)])

Push (&stack, &(*padj) -> list[get_index (padj, scan -> name)].name) ;

scan = scan -> next ;

}

}

if (counter != capacity)

puts ("Graph has cycle.") ;

ReleaseStack (&stack) ;

}

void print_name (const Name vertex)

{

printf ("%c ", vertex) ;

}

void print_stack (const Stack_Node * const pstack_node)

{

printf ("%c/n", pstack_node -> name) ;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值