strcpy나 strchr의 리턴 타입이 이상하다는 것만 빼면 자연스러워 보인다. 매개변수로 전달하는 배열은 길이를 모르기 때문에 [static 1]이라고 표시한 부분은 최소한 char가 하나 있는 배열이다. strlen, strspn, strcspn은 크기를 리턴하고, strcmp는 인수의 정렬 순서에 따라 음수와 0, 양수 값 중 하나를 리턴한다.
배열 함수의 선언문은 그보다 더 복잡하다.
void* memcpy(void* target, void const* source, size_t len); signed memcmp(void const* s0, void const* s1, size_t len); void* memchr(const void *s, int c, size_t n);
void*로 지정한 대상의 의미는 아직 설명한 적이 없는데, 타입을 모르는 오브젝트에 대한 포인터(pointer)를 의미한다. 포인터 개념에 대한 상세한 설명과 void 타입에 대해서는 레벨 2(11장)에서 자세히 소개한다.
도전 7 인접 행렬
어떤 그래프 G에 대한 인접 행렬(adjacency matrix)은 노드 i가 노드 j로 이어지는 간선(arc)의 존재 여부에 따라 원소 a[i][j]의 값이 true 또는 false인 행렬이다.
그렇다면 인접 행렬을 이용하여 그래프 G에 대해 너비 우선 탐색(breadth-first search)을 수행하고, 연결된 성분을 찾아보자. 또한 스패닝 트리(spanning tree)도 구해 보자.
도전 8 최단 경로
그래프 G에 대한 인접 행렬이란 개념을 확장해서 점 i에서 점 j까지의 거리를 담은 거리 행렬(distance matrix)을 정의해 보자. 이때 직접 연결되는 간선이 없다는 것을 굉장히 큰 값(예 SIZE_MAX)으로 표현한다. 그렇다면 입력으로 주어진 두 노드 x와 y 사이의 최단 경로(shortest path)를 찾을 수 있을까?