현재 선택한 정보처리 과정

정보처리기사 실기 이론 학습

이론 목록으로 돌아가기

C 구조체·연결 구조

구조체 값과 다음 노드 주소를 분리해 연결을 그린다.

예상 읽기 3

실기 학습 목표

구조체 값과 다음 노드 주소를 분리해 연결을 그린다.

핵심 이론

struct는 서로 다른 자료형의 멤버를 묶는다. typedef는 타입 별칭이다. 객체의 멤버는 .으로, 구조체 포인터의 멤버는 ->로 접근한다. p->value는 (*p).value와 같다.

구조체 대입은 멤버 값을 복사하지만 포인터 멤버가 가리키는 대상까지 자동 복제하지 않는다. 복사본들이 같은 대상을 공유하는지 확인한다.

연결 리스트는 각 노드의 값과 next를 따로 그린다. cur=cur->next는 탐색 위치만 바꾸고 cur->next=...는 연결 자체를 바꾼다.

삽입·삭제는 잃으면 안 되는 다음 주소를 먼저 보존한다. 순환 여부와 NULL 종료를 확인하며 실제 주소 숫자는 문제에서 주지 않으면 기호로 추적한다.

연결 리스트에서는 값과 연결을 별도로 기록한다

구조체 변수 n의 멤버는 n.value, 구조체 포인터 p가 가리키는 멤버는 p->value로 접근한다. p->value(*p).value와 같다. 자기 참조 구조체는 다음 노드의 주소를 멤버로 담아 서로 떨어진 노드를 연결한다.

처음 연결이 A→B→C이고 새 노드 X를 A와 B 사이에 넣는다면 X.next=A.next로 기존 B 주소를 보관한 뒤 A.next=&X로 바꾼다. 반대로 A.next부터 바꾸면 기존 연결을 별도로 보관하지 않은 경우 B로 이어지는 주소를 잃을 수 있다.

단계A.nextX.next탐색 순서
초기B미정A, B, C
X.next에 B 저장BBA, B, C
A.next를 X로 변경XBA, X, B, C

삭제도 앞 노드의 next를 삭제 대상의 next로 연결하는 과정이다. 연결에서 제외하는 것과 동적 메모리를 free하는 것은 서로 다른 작업이다. 포인터 변수를 다른 노드로 옮겨도 원래 노드의 value는 자동으로 변하지 않는다. 출력값은 마지막 연결을 head부터 실제로 따라가며 읽는다.

풀이 예시

다음 C17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다.

C코드 영역 안에서 좌우로 이동할 수 있습니다.
#include <stdio.h>
struct Node { int v; struct Node *next; };
int main(void) {
    struct Node a = {2, NULL}, b = {5, NULL}, c = {7, NULL};
    a.next = &b; b.next = &c;
    a.next = a.next->next;
    b.v += a.v;
    int s = 0;
    for (struct Node *p = &a; p; p = p->next) s = s * 10 + p->v;
    printf("%d %d\n", s, b.v);
    return 0;
}

예시 정답

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
27 7

풀이 과정

a.next가 c로 바뀌어 a부터 순회하는 경로는 a→c이다. 값은 2,7이므로 누적 s는 27이다. b는 경로에서 빠졌지만 객체는 살아 있으며 b.v는 5+2=7이다.

답안 점검

위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.