6.1.1 방향성 없는 그래프 소스 코드

다음은 C언어로 작성한 방향성 없는 그래프 소스 코드입니다.

//방향성 없는 그래프
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
  
 typedef struct{//그래프 형식 정의
     int vn; //정점 개수
     int **matrix;//그래프 인접 행렬
 }Graph;
  
 Graph *MakeGraph();//그래프 만들기
 void ViewNeighbors(Graph *g);//이웃 정점 보여주기
 void DeleteGraph(Graph *graph);//그래프 소멸 
  
  
 int main(void)
 {         
     Graph *graph;
     graph = MakeGraph();//그래프 만들기     
     ViewNeighbors(graph); //이웃 정점 보여주기
     DeleteGRaph(graph);//그래프 소멸
     return 0;
 }
  
 Graph *NewGraph(int max_vertex);//그래프 동적 생성
 void AddEdge(Graph *graph, int start, int goal);//간선 추가
 Graph *MakeGraph()
 {
     Graph *graph;
     graph = NewGraph(9);//그래프 동적 생성
     AddEdge(graph, 0, 1);//간선 추가
     AddEdge(graph, 0, 2);//간선 추가
     AddEdge(graph, 1, 2);//간선 추가
     AddEdge(graph, 1, 3);//간선 추가
     AddEdge(graph, 2, 4);//간선 추가
     AddEdge(graph, 3, 6);//간선 추가
     AddEdge(graph, 4, 5);//간선 추가
     AddEdge(graph, 4, 6);//간선 추가
     AddEdge(graph, 4, 7);//간선 추가
     AddEdge(graph, 6, 8);//간선 추가
     return graph;
 }
 Graph *NewGraph(int max_vertex)
 {
     int i = 0;
     Graph *graph = (Graph *)malloc(sizeof(Graph));//그래프 메모리 동적 할당
     graph->vn = max_vertex;//최대 정점 개수 설정
     graph->matrix = (int **)malloc(sizeof(int *)*max_vertex);//매트릭스 메모리 할당
     for (i = 0; i < max_vertex; i++)
     {
         graph->matrix[i] = (int *)malloc(sizeof(int)*max_vertex);//매크릭스 [i-row] 메모리 할당
         memset(graph->matrix[i], 0, sizeof(int)*max_vertex);//메모리 0으로 초기화
     }
     return graph;
 }
 void DeleteGRaph(Graph *graph)
 {
     int i = 0;
     
     for (i = 0; i < graph->vn; i++)//최대 정점 개수만큼
     {
         free(graph->matrix[i]);//매트릭스 [i-row]  메모리 소멸
     }
     free(graph->matrix);//매트릭스 메모리 해제
     free(graph);//그래프 메모리 해제
 }
 void AddEdge(Graph *graph, int start, int goal)
 {
     graph->matrix[start][goal] = 1;//간선 설정
     graph->matrix[goal][start] = 1;//간선 설정
 }
 void ViewNeighbor(Graph *g,int vt);
 void ViewNeighbors(Graph *g)
 {
     int i;     
     printf("=== 이웃 정점 ===\n");
     for (i = 0; i < g->vn; i++)
     {
         printf("%d의 이웃: ",i);
         ViewNeighbor(g,i);//i정점의 이웃 보여주기
         printf("\n");
     }     
 }
 void ViewNeighbor(Graph *g,int vt)
 {
     int i;
     for (i = 0; i < g->vn; i++)
     {
         if(g->matrix[vt][i])
         {
             printf("%d ",i);
         }
     }
 }