構造無向圖
以下代碼實現了臨接矩陣構造graph。代碼實現了無向圖的構造。原圖如下:
上圖的鄰接矩陣如下:
/*
/**
* 鄰接矩陣實現的map
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define IS_LETTER(c) ( (((c) >= 'a') && ((c) <= 'z')) || (((c) >= 'A') && ((c) <= 'Z')) )
#define LENGTH(c) (sizeof(c)/(sizeof(c[0])))
#define MAX_VERTEX (200)
// 臨接矩陣結構體
typedef struct GRAPH
{
int vertex_number;
int edge_number;
char vertex[MAX_VERTEX];
int matrix[MAX_VERTEX][MAX_VERTEX];
}Graph, *P_Graph;
char get_letter()
{
char ch;
ch = getchar();
while(!IS_LETTER(ch))
{
ch = getchar();
}
return ch;
}
int get_position(Graph graph, char ch)
{
for (int i = 0; i < graph.vertex_number; ++i)
{
if (graph.vertex[i] == ch)
{
return i;
}
}
return -1;
}
Graph *create_graph()
{
char c1, c2;
int pos1, pos2;
int vertex, edge;
Graph *p_graph = NULL;
printf("輸入頂點數量:");
scanf("%d", &vertex);
printf("輸入邊的數量:");
scanf("%d", &edge);
if (vertex < 1 || edge < 1 || (edge > (vertex*(vertex-1))))
{
printf("輸入參數有誤,不符合圖的要求!\n");
return NULL;
}
p_graph = (Graph *)malloc(sizeof(Graph));
if (NULL == p_graph)
{
return NULL;
}
memset(p_graph, 0, sizeof(Graph));
p_graph->vertex_number = vertex;
p_graph->edge_number = edge;
// 初始化頂點
for (int i = 0; i < p_graph->vertex_number; ++i)
{
printf("頂點:[%d] ", i);
p_graph->vertex[i] = get_letter();
}
// 初始化邊
for (int i = 0; i < p_graph->edge_number; ++i)
{
printf("邊: %d", i);
c1 = get_letter();
c2 = get_letter();
pos1 = get_position(*p_graph, c1);
pos2 = get_position(*p_graph, c2);
if (pos1 == -1 || pos2 == -1)
{
free(p_graph);
return NULL;
}
p_graph->matrix[pos1][pos2] = 1;
p_graph->matrix[pos2][pos1] = 1;
}
return p_graph;
}
/*
* 創建圖(用已提供的矩陣)
*/
Graph* create_graph_2(char *vertex, char edges[][2], int vlen, int elen)
{
int i, p1, p2;
Graph* pG;
if ((pG=(Graph*)malloc(sizeof(Graph))) == NULL )
return NULL;
memset(pG, 0, sizeof(Graph));
// 初始化"頂點數"和"邊數"
pG->vertex_number = vlen;
pG->edge_number = elen;
printf("頂點數量: %d 邊數 :%d\n", vlen, elen);
// 初始化"頂點"
for (i = 0; i < pG->vertex_number; i++)
{
pG->vertex[i] = vertex[i];
}
// 初始化"邊"
for (i = 0; i < pG->edge_number; i++)
{
// 讀取邊的起始頂點和結束頂點
p1 = get_position(*pG, edges[i][0]);
p2 = get_position(*pG, edges[i][1]);
pG->matrix[p1][p2] = 1;
pG->matrix[p2][p1] = 1;
}
return pG;
}
void print_graph(Graph graph)
{
printf("頂點數量: %d\n", graph.vertex_number);
for (int i = 0; i < graph.vertex_number; ++i)
{
for (int j = 0; j < graph.vertex_number; ++j)
{
printf("%d ", graph.matrix[i][j]);
}
printf("\n");
}
}
int main(int argc, char const *argv[])
{
char vertex[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
char edges[][2] = {
{'A', 'C'},
{'A', 'D'},
{'A', 'F'},
{'B', 'C'},
{'C', 'D'},
{'F', 'G'},
{'G', 'E'},
{'E', 'H'}};
Graph* p_graph_2 = create_graph_2(vertex, edges, LENGTH(vertex), LENGTH(edges));
print_graph(*p_graph_2);
// Graph* p_graph = create_graph();
// print_graph(*p_graph);
return 0;
}
代碼結果驗證
如何構造有向圖呢
與無向圖唯一的區別是,邊的數組是帶有方向的,所以在這裏pG->matrix[p1][p2]=1
即可。
改完之後,得出結果