鍍金池/ 教程/ Java/
標(biāo)準(zhǔn)輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測試與評測
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯誤處理
VS Code 安裝配置
動態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實(shí)現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫
類型、運(yùn)算符和字符串
類型系統(tǒng)中的幾個常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標(biāo)準(zhǔn)庫示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對象
前期準(zhǔn)備
代碼風(fēng)格
編譯器參數(shù)
基于語義化版本的項(xiàng)目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應(yīng)用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊(duì)列
目錄操作:簡單grep
語句和表達(dá)式
并發(fā)編程
閉包
測試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊(duì)列
Prelude
cargo簡介
控制流(control flow)
數(shù)組、動態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實(shí)戰(zhàn)篇
Rust 是一門系統(tǒng)級編程語言,被設(shè)計(jì)為保證內(nèi)存和線程安全,并防止段錯誤。作為系統(tǒng)級編程語言,它的基本理念是 “零開銷抽象”。理
運(yùn)算符重載
Any和反射
rust數(shù)據(jù)庫操作
輸入輸出流
復(fù)合類型
性能測試

圖的存儲結(jié)構(gòu)

圖的存儲結(jié)構(gòu)除了要存儲圖中各個頂點(diǎn)的本身信息外,同時還要存儲頂點(diǎn)與頂點(diǎn)之間的所有關(guān)系(邊的信息),因此,圖的結(jié)構(gòu)比較復(fù)雜,很難以數(shù)據(jù)元素在存儲區(qū)中的物理位置來表示元素之間的關(guān)系,但也正是由于其任意的特性,故物理表示方法很多。常用的圖的存儲結(jié)構(gòu)有鄰接矩陣、鄰接表等。

鄰接矩陣表示法

對于一個具有n個結(jié)點(diǎn)的圖,可以使用n*n的矩陣(二維數(shù)組)來表示它們間的鄰接關(guān)系。矩陣 A(i,j) = 1 表示圖中存在一條邊 (Vi,Vj),而A(i,j)=0表示圖中不存在邊 (Vi,Vj)。 實(shí)際編程時,當(dāng)圖為不帶權(quán)圖時,可以在二維數(shù)組中存放 bool 值。

  • A(i,j) = true 表示存在邊 (Vi,Vj),
  • A(i,j) = false 表示不存在邊 (Vi,Vj);

當(dāng)圖帶權(quán)值時,則可以直接在二維數(shù)值中存放權(quán)值,A(i,j) = null 表示不存在邊 (Vi,Vj)。

下面看看我們使用鄰接矩陣實(shí)現(xiàn)的圖結(jié)構(gòu):

#[derive(Debug)]
struct Node {
    nodeid: usize,
    nodename: String,
}

#[derive(Debug,Clone)]
struct Edge {
    edge: bool,
}

#[derive(Debug)]
struct Graphadj {
    nodenums: usize,
    graphadj: Vec<Vec<Edge>>,
}

impl Node {
    fn new(nodeid: usize, nodename: String) -> Node {
        Node{
            nodeid: nodeid,
            nodename: nodename,
        }
    }
}
impl Edge {
    fn new() -> Edge {
        Edge{
            edge: false,
        }
    }
    fn have_edge() -> Edge {
        Edge{
            edge: true,
        }
    }
}

impl Graphadj {
    fn new(nums:usize) -> Graphadj {
        Graphadj {
            nodenums: nums,
            graphadj: vec![vec![Edge::new();nums]; nums],
        }
    }

    fn insert_edge(&mut self, v1: Node, v2:Node) {
        match v1.nodeid < self.nodenums && v2.nodeid<self.nodenums {
            true => {
                self.graphadj[v1.nodeid][v2.nodeid] = Edge::have_edge();
                //下面這句注釋去掉相當(dāng)于把圖當(dāng)成無向圖
                //self.graphadj[v2.nodeid][v1.nodeid] = Edge::have_edge();
            }
            false => {
                panic!("your nodeid is bigger than nodenums!");
            }
        }
    }
}

fn main() {
    let mut g = Graphadj::new(2);
    let v1 = Node::new(0, "v1".to_string());
    let v2 = Node::new(1, "v2".to_string());
    g.insert_edge(v1,v2);
    println!("{:?}", g);
}

鄰接表表示法

鄰接表是圖的一種最主要存儲結(jié)構(gòu),用來描述圖上的每一個點(diǎn)。

實(shí)現(xiàn)方式:對圖的每個頂點(diǎn)建立一個容器(n個頂點(diǎn)建立n個容器),第i個容器中的結(jié)點(diǎn)包含頂點(diǎn)Vi的所有鄰接頂點(diǎn)。實(shí)際上我們常用的鄰接矩陣就是一種未離散化每個點(diǎn)的邊集的鄰接表。

  • 在有向圖中,描述每個點(diǎn)向別的節(jié)點(diǎn)連的邊(點(diǎn) a->點(diǎn) b 這種情況)。
  • 在無向圖中,描述每個點(diǎn)所有的邊(點(diǎn) a->點(diǎn) b這種情況)

與鄰接表相對應(yīng)的存圖方式叫做邊集表,這種方法用一個容器存儲所有的邊。

練習(xí):

實(shí)現(xiàn)鏈接表表示法的圖結(jié)構(gòu)。