采用双重循环,外层循环遍历邻接表的顶点表,内层循环遍历该顶点的边表,该顶点的序号为行标号、该边所指向的顶点序号为列标号,把对应的邻接矩阵所对应的元素设为1。
#include <iostream>
using namespace std;
struct ArcNode //边表
{
int node; //所指向的顶点的序号
ArcNode* next;
};
struct Vertex //顶点表
{
ArcNode* arc = NULL; //指向的边
};
void build_adjacency_list(Vertex *&adjacency_list, int n) //建立一个邻接表
{
int a, b;
ArcNode* p = NULL;
adjacency_list = new Vertex[n];
cin >> a >> b;
while (a >= 0 && b >= 0)
{
p = new ArcNode;
p->node = b;
p->next = adjacency_list[a].arc;
adjacency_list[a].arc = p;
cin >> a >> b;
}
}
int** build_adjacency_matrix(Vertex adjacency_list[], int n) //根据邻接表adjacency_list建立邻接矩阵,顶点个数为n
{
int** adjacency_matrix = new int* [n];
for (int i = 0; i < n; i++)
adjacency_matrix[i] = new int[n];
ArcNode* p = NULL;
for (int i = 0; i < n; i++) //初始化邻接矩阵
{
for (int j = 0; j < n; j++)
adjacency_matrix[i][j] = 0;
}
for (int i = 0; i < n; i++) //根据邻接表建立邻接矩阵
{
p = adjacency_list[i].arc;
while (p != NULL)
{
adjacency_matrix[i][p->node] = 1;
p = p->next;
}
}
return adjacency_matrix;
}
void traverse_adjacency_list(Vertex adjancency_list[], int n) //遍历邻接表
{
ArcNode* p = NULL;
for (int i = 0; i < n; i++)
{
p = adjancency_list[i].arc;
cout << i << '\t';
while (p != NULL)
{
cout << p->node << '\t';
p = p->next;
}
cout << endl;
}
}
void traverse_adjacency_matrix(int** adjacency_matrix, int n) //遍历邻接矩阵
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << adjacency_matrix[i][j] << ' ';
}
cout << endl;
}
}
int main(void)
{
int n; //顶点的个数
cin >> n;
Vertex* adjacency_list = NULL;
build_adjacency_list(adjacency_list, n); //创建一个邻接表
cout << "\nadjacency list:" << endl;
traverse_adjacency_list(adjacency_list, n); //遍历该邻接表
int** adjacency_matrix = build_adjacency_matrix(adjacency_list, n); //建立对应的邻接矩阵
cout << "\nadjacency matrix:" << endl; //遍历该邻接矩阵
traverse_adjacency_matrix(adjacency_matrix, n);
return 0;
}