每一行都可以看成乙個單鏈表,第一行中,v0-1-3可以得到,v0的出度為v1和v3。
鄰接表完整**:
#include using namespace std;
const int max_v = 15;
//邊節點
typedef struct edge_node enode,*penode;
//表節點
typedef struct list_node lnode, *plnode;
int main()
//輸出
cout <
display( list, v );
cout << "clear:\n";
clear( list, v );
return 0;
}void addedge( char v1, char v2, plnode list, int v )
}}void display( plnode list, int v )
cout
p = p->next;
delete todel;
}cout << endl;}}
重新定義表節點結構:增加了兩個指標firstin,firstout。分別用來指向該頂點的入(出)邊表中第乙個結點。
firstin表示入邊表頭指標,指向該頂點的入邊表中第乙個結點;
firstout表示出邊表頭指標,指向該頂點的出邊表中第乙個結點;
tailvex是指弧起點在頂點的下標,
headvex是指弧終點在頂點表中的下標,
headlink是指入邊表指標域,指向終點相同的一下條邊
taillink是指出邊表指標域,指向起點相同的下一條邊。
對比與鄰接表相比,這裡的 taillink 指標就相當於鄰接表裡的那個指標,指向出度的下乙個節點。而這裡的 headlink 就是新增加的用來記錄入度的指標。
首先,橫著看:每一行都可以看出單鏈表,把從 firstout 出來的串起來就是出度(類似鄰接表);
豎著看(不太明顯):從 headlink 出來的指標指向串起來,都是入度節點。
那為什麼要重複儲存節點資訊呢?例如圖中的0存了2次,1存了3次等。這是為了方便找入度節點。試想,鄰接錶用乙個指標乙個節點資訊來儲存方便找出度,那麼要是出度入度都方便找,自然要給入度也加上乙個指標(headlink)和乙個資料域(tailvex)。這樣當找到入度的邊接節點,取出 headlink 就找到入度節點了。
將邊節點結構分割:
入度:headlink + tailvex;
出度:taillink + headvex;
十字鍊錶**:
#include #include using namespace std;
const int max_v = 15;
//邊節點
typedef struct edge_node enode,*penode;
//表節點
typedef struct list_node lnode, *plnode;
int main()
//輸出
cout <
display( list, v );
cout << "clear:\n";
clear( list, v );
return 0;
}void addedge( char v1, char v2, plnode list, int v )
int getindex( char x, plnode list, int v )
cout
p = p->headlink;
}cout
p = p->taillink;
delete todel;
}cout << endl;}}
6 2 3 十字鍊錶 鄰接多重表
十字鍊錶法 用於儲存有向圖 鄰接多重表 用於儲存無向圖 十字鍊錶法 通過乙個指標找到指向的,通過另乙個結點找到被指向的 只要順著兩個指標就能很容易的找到入度和出度 注意 十字鍊錶只用於儲存有向圖 在無向圖中,如果進行刪除操作需要刪除多份檔案,有冗餘,優化這個鄰接表 鄰接多重表用於存放無向圖,每個結點...
十字鍊錶(Java)
對於有向圖來說,鄰接表是有缺陷的。關心了出度問題,想要了解入度情況就必須要遍歷整個圖才能知道。反之也一樣。那麼,這一節就介紹有向圖的一種儲存方法,它能將鄰接表和逆鄰接表結合起來 十字鍊錶。定義頂點表結點結構 vertex firstin firstout 其中,firstin表示入邊表頭指標,指向該...
十字鍊錶 Working routine
工作使艾奇快樂。勤奮的工作為國家直接貢獻了gdp,艾奇認為只要對國家有利,即使犧牲自己生命也心甘情願,絕不會因為自己可能受到禍害而躲開。當艾奇無聊的時候,她就會去工作,然而並不是每次工作都是輕鬆而愉悅的。當天艾奇又一次來到了學校,等待著她的是乙個有n 行m 列的巨大的矩陣和q個任務。對於每個任務,艾...