본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

#18 [C 자료구조] 자기 참조 구조체: 나야나

자기 참조 구조체 (Self-Referential Structure)는

구조체의 멤버가 자신의 구조체를 가리키는 포인터를 가질 때를 말한다.

구조체 멤버가 다른 구조체 다른 인자를 함수로써 써야할 때 필요하다.

이런 경우다!

자 코드로는 어떻게 구현하는지 살펴보자.

 

typedef struct node {
	char data;
	struct node *link;
} node;

위는 node 구조체의 안에서 *link를 통해 다시 자기 자신을 호출하는 방법이다.

이를 연결 시켜가면 이렇게 다른 node구조체를 호출할 수 있게 된다.

다른 구조체를 부르는 코딩을 짜보자!!

node item1, item2, item3;
item1.data = 'a';
item2.data = 'b';
item3.data = 'c';
item1.link = item2.link = item3.link = NULL;
item1.link = &item2;
item2.link = &item3;

typedef로 설정된 node item1,2,3의 char에 맞는 데이터를 기입해 넣어놓고 이들의 주소값을 link에 넣는 모습이다.

 

즉, 하나의 구조체는 data와 다음 data를 가르키는 link를 가지는 것이다. 언젠가 배웠던 기억이 나지 않는가? data 저장방법에서 배운 것을 그대로 구조체로 옮겨온 것이다.

 

이를 다시 포인터와 조합해 끔찍한 혼종을 만들어 보자.

typedef struct NODE {
int data;
struct NODE *link;
} NODE;

int main(void) {
	NODE *p1; NODE *p2;
	NODE *head;

    p1 = (NODE *) malloc(sizeof(NODE));
    p1->data = 10;
    p1->link = NULL;

    p2 = (NODE *) malloc(sizeof(NODE));
    p2->data = 20;
    p2->link = NULL;

    head = p1;
    p1->link = p2;

	while ( head != NULL ) {
		printf("%d ", head->data);
		head = head->link;
		}

free(p1);
free(p2);
return 0;
}

위 식은 p1과 p2 구조체를 정의하고, head가 p1의 주소값을 갖게 한 뒤, p2의 주소값을 p1이 갖게 만든 식이다.

마지막으로 while 구문에서 head->data를 통해 p1 데이터인 10을, head->link를 통해 p2의 20을 출력하고 head는 p2의 링크가 없으므로 null이 된다.

 


 

 

다른 구조체의 value를 가리키는 자기 참조 구조체!!! 기억해두자. 제발