前兩篇部落格我們討論了prim最小生成樹的演算法,熟悉了基本的流程。基本上來說,我們是按照自上而下的順序來編寫**的。首先我們搭建乙個架構,然後一步一步完成其中的每乙個子功能,這樣最後構成乙個完成prim演算法計算過程。
f)將dir_line佇列中不符合的資料刪除,主要是雙節點都已經訪問過的dir_line資料。
void delete_unvalid_line_from_list(dir_line** pphead, mini_generate_tree* pminitree)
prev = pcur;
pcur = pcur->next;
} return;
}
g) 在f)函式中使用了判定dir_line合法性的函式,我們需要完善一下。
int check_valid_for_line(dir_line* pdirline, mini_generate_tree* pminitree)
} for(index = 0; index < pminitree->node_num; index ++)
} return (1 == flag_start && 1 == flag_end) ? 0 : 1;
}
h) 最後就是對當前已經入隊的dir_line資料排序,其實就是鍊錶排序。
void insert_for_sort_operation(dir_line** ppnode, dir_line* pnode)
cur = *ppnode;
while(cur)
pnode->next = prev->next;
prev->next = pnode;
return;
} void sort_for_line_list(dir_line** ppnode)
}
演算法總結:
1)演算法本身還有改進的空間,比如是不是記憶體分配上每一次都要重建dir_line佇列有待商榷
2)演算法編寫不是一部就位的,中間有反覆更有刪改,寫四五次是很正常的事情
3)編寫**的時候最好做到邊修改、邊測試,這樣可以一方面增加**的健壯度,一方面還能提高自己的信心
4)如果存在可能,可以復用以前寫過的、穩定的演算法**,比如說排序、查詢、堆疊、二叉樹之類的**
一步一步寫演算法(之prim演算法 上)
原文 一步一步寫演算法 之prim演算法 上 前面我們討論了圖的建立 新增 刪除和儲存等問題。今天我們將繼續討論圖的一些其他問題,比如說如何在圖的環境下構建最小生成樹。為什麼要構建最小生成樹呢?其實原理很簡單。打個比方,現在某乙個鄉鎮有n個村,那麼這n個村肯定是聯通的。現在我們打算在各個村之間搭建網...
一步一步寫演算法(之prim演算法 中)
c 編寫最小生成樹,涉及建立 挑選和新增過程 mini generate tree get mini tree from graph graph pgraph mini generate tree pminitree dir line pdirline if null pgraph null pgr...
一步一步寫演算法(之 A 演算法)
在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...