话说,这个东西我写了前前后后4天有余, 光今天就写了10小时.终于写完了.感触颇多啊.!
新的数据结构需要以前的数据结构结合使用,我沿着思路,进行设计,之后开始动笔,呵呵.开始写,就是.
从Hash表,到邻接表,再到二叉堆,磕磕绊绊,自己写得比较着急,结果我还没有那么熟练,无法快速完成.能够完成,我就已经很高兴了.呵呵.
很多概念,是随着写代码灵光起来的.写着写着,想起来书上原来有讲过,呵呵.
对于Hash表和二叉堆的理解,总是在渐渐深刻,主要是那两章学得比较着急.所以,现在就到难受的时候了,呵呵.还算凑合,虽然有些繁琐,.
对于多文件编译,感觉比较陌生,在今后的编码过程中总结经验,去阅读相关的书籍.
邻接表实现文件是一个新的,因为是赋权图,被迫修改的.比较有通用性,用着也比较方便.
不想多说了,脖子疼.去睡觉了准备.开始贴代码.哈哈.
int main (void) ;
int dijkstra (const Adjacenty_List * padj, const Hash_Table * const pht, const int start) ;
int main (void)
{
Adjacenty_List adj ;
Hash_Table ht ;
int capacity = 11 ;
Initialize_H (&ht, capacity * 2) ;
Initialize_A (&adj, capacity) ;
InitializeALine_A (&adj, &ht, 0, 's', 0, 6, 'a', 1, 'd', 4, 'g', 6) ;
InitializeALine_A (&adj, &ht, 1, 'a', 2, 4, 'b', 2, 'e', 2) ;
InitializeALine_A (&adj, &ht, 2, 'b', 1, 2, 'c', 2) ;
InitializeALine_A (&adj, &ht, 3, 'c', 3, 2, 't', 4) ;
InitializeALine_A (&adj, &ht, 4, 'd', 2, 4, 'a', 3, 'e', 3) ;
InitializeALine_A (&adj, &ht, 5, 'e', 4, 6, 'c', 2, 'f', 3, 'i', 3) ;
InitializeALine_A (&adj, &ht, 6, 'f', 2, 4, 'c', 1, 't', 3) ;
InitializeALine_A (&adj, &ht, 7, 'g', 1, 6, 'd', 2, 'e', 1, 'h', 6) ;
InitializeALine_A (&adj, &ht, 8, 'h', 1, 4, 'e', 2, 'i', 3) ;
InitializeALine_A (&adj, &ht, 9, 'i', 2, 4, 'f', 1, 't', 4) ;
InitializeALine_A (&adj, &ht, 10, 't', 3, 0) ;
dijkstra (&adj, &ht, 0) ;
PrintAdjacenty_List_A (&adj, &ht) ;
Release_H (&ht) ;
Release_A (&adj) ;
return 0 ;
}
int dijkstra (const Adjacenty_List * padj, const Hash_Table * const pht, const int start)
{
Binary_Heap bh ;
Vertex * v ;
Adjoin_To_Vertex * w ;
int capacity = (*padj) -> capacity, i ;
Initialize_B (&bh, capacity * 2) ;
(*padj) -> list[start].dist = 0 ;
for (i = 0; i < capacity; i++)
Insert_B (&bh, (*padj) -> list + i) ;
while (1)
{
do
{
v = DeleteMin_B (&bh) ;
if (NEGATIVEINFINITY == v -> dist)
break ;
}
while (TRUE == (*pht) -> lists[v -> hash_value].be_deleted)
;
if (NEGATIVEINFINITY == v -> dist)
break ;
(*pht) -> lists[v -> hash_value].be_deleted = TRUE ;
v -> known = TRUE ;
w = v -> adjoin_to ;
while (w)
{
if (FALSE == (*padj) -> list[(*pht) -> lists[w -> hash_value].index_in_adjacenty_list].known)
{
if (v -> dist + w -> cvw < (*padj) -> list[(*pht) -> lists[w -> hash_value].index_in_adjacenty_list].dist)
{
(*padj) -> list[(*pht) -> lists[w -> hash_value].index_in_adjacenty_list].dist = v -> dist + w -> cvw ;
Insert_B (&bh, (*padj) -> list + (*pht) -> lists[w -> hash_value].index_in_adjacenty_list) ;
(*padj) -> list[(*pht) -> lists[w -> hash_value].index_in_adjacenty_list].path = (*pht) -> lists[v -> hash_value].name ;
}
}
w = w -> next ;
}
}
Release_B (&bh) ;
return 1 ;
}