要談鄰接表,那我們先談談鄰接矩陣,因為鄰接表就是因為鄰接矩陣對於稀疏圖造成記憶體的很大浪費。那麼它是如何浪費的哪? 別急慢慢來!
#define max_vertex_num 20
/*最多頂點數目*/
#define infinity 32768
/*表示最大值*/
#include
#include
/*圖的種類: dg表示有向圖 dn表示有向網 udg表示無向圖 udn表示無向網*/
typedef
enum
graphkind;
typedef
int vertexdata;
//假設頂點資料為字元型
typedef
struct arcnode//儲存鄰接結點的資訊
arcnode;
typedef
struct
adjmatrix;
//鄰接矩陣資訊
intlocatevertex
(adjmatrix *g, vertexdata v)
//找頂點函式
}return
(j);
}int
main()
}printf
("請輸入頂點的資料\n");
for(i =
0; i < g->vexnum; i++
)printf
("請輸入兩個頂點和權值\n");
for(k =
0; k < g->arcnum; k++
)//兩個頂點建立聯絡
//建弧完成
printf
("列印出帶權圖結構如下\n");
for(i =
0; i < g->vexnum; i++
)printf
("\n");
}system
("pause");
return0;
}
執行結果如下:
從圖中我們發現存了不少0,表示它們不是鄰接關係,但是我們並不需要記住它們不相鄰,所以這就大大浪費了記憶體。所以就有了鄰接表法儲存。
typedef struct arcnode//結點存放的資訊()
typedef struct vertexnode//存放頂點資料,就是上圖中的第一列的資料,因為每個資料的出度情況是不同的
vertexnode;
上面的結構體構成的只是一條線(上圖中的第一行) 要想儲存所有的話,就要用陣列來表示了
typedef struct
adjlist;//鄰接目錄
接下來**如下
#include
#include
#define max_vertex_num 20
#define vertexdata int
#define max 100
#define size 4
//儲存數字的大小
#define bian 4
//儲存邊的大小
int edge[
1000][
2]=;
typedef
enum
graphkind;
//圖的種類
typedef
struct arcnode
arcnode;
typedef
struct vertexnode
vertexnode;
typedef
struct
adjlist;
//鄰接目錄
intfind_insert
(arcnode *edge, arcnode *temp)
p->nextarc = temp;
//插入找到的邊
return0;
}adjlist*
cregraph()
//建立圖
//再確定哪兩個頂點連線需要存邊0代表出度連線1代表入度
for(
int i =
1; i <= picture->arcnum; i++
)//建立聯絡
else
}return picture;
}int
main()
picture =
cregraph()
;printf
("鄰接表如下\n");
for(
int i =
1; i <= picture->vexnum; i++
)else
}printf
("\n");
}system
("pause");
return0;
}
鄰接表轉鄰接矩陣
假設無向圖g採用鄰接矩陣儲存,編寫乙個演算法輸出鄰接表。description 第一行為乙個 整數n,表示頂點的個數 頂點 編號為0到n 1 接下來是為乙個n n大小的 整數矩陣,表示圖的鄰接關係。數字為0表示不鄰接,1表示鄰接。input 輸出圖g的鄰接表。第一行表示頂點0可直接到達的 頂點編號。...
鄰接矩陣與鄰接表
鄰接矩陣表示圖 public class graph private int vertexnum private int edgenum private int g 鄰接矩陣 public graph int vertexnum public void insertedge edge edge pu...
鄰接矩陣 鄰接鍊錶 轉換
include include include graph.h include using namespace std typedef int infotype define maxv 100 最大頂點個數 define inf 32767 inf表示 以下定義鄰接矩陣型別 typedef stru...