본문 바로가기

CS/자료구조

[인프런|13강] C로 배우는 자료구조 | 연결 리스트 (2)

연결리스트 (2)

 

 

 

 

int main()

{

  Node *head = (Node *)malloc(sizeof(Node));

  head->data = "Tuesday";

  head->next = NULL;

 

  Node *q = (Node *)malloc(sizeof(Node));

  q->data = "Thrusday";

  q->next = NULL;

  head->next = q;

  

  q = (Node *)malloc(sizeof(Node));

  q->data = "Monday";

  q->next = head;

  head = q;

  

  Node *p = head;

  while(p!=NULL) {

    printf("%s\n", p->data);

    p = p->next;  // 다음 노드의 주소를 p에 담는다. 맨 마지막 노드까지 출력되기 위해!

  } 

}

처음에 Node 구조체 타입의 head 포인터 변수동적할당으로 생성하여

data에는 Tuesday, next에는 Null 값을 넣어준다.

 

마찬가지로 Node 구조체 타입의 q 포인터 변수를  동적할당으로 생성하여

data에 Thursday, next에는 Null 값을 넣어준다.

 

Tuesday와 Thursday가 서로 연결되어야 하므로 

Tuesday가 있는 head포인터 변수 next에 Thursday를 담고있는 q의 주소를 넣어준다

 

기존에 있는 q 포인터 변수를 재활용하여  동적할당으로 새로운 Node구조체 타입의 변수를 찍어낸다.

data에는 Monday, next에는 가르켜야할 Tuesday를 변수의 주소를 넣어준다.

Tuesday 주소는 head변수에서 가지고 있으므로 head 변수 가르키고 있는 값을 복사한다.

 

마지막으로 연결리스트가 어떤식으로 데이터를 가지고있고 서로 연결되어있는지 확인한다.

Node구조체 타입의 p 변수를 만들어서 head변수의 저장된 값을 복사한다.

p변수가 NULL이 아닌동안 반복되게한다.(현재 p가 가르키고 있는 노드의 next 필드에 저장된 값)

처음 head변수의 주소를 p변수에 복사하였으니

head변수가 가르키는 노드를 가르키고

p는 p->next에서 가르키는 다음 변수의 주소 값을 받으므로 

p->next가 NULL일때까지 반복하게된다.

즉, 연결리스트 끝까지 순회한다.

 

head로 반복문을 돌려도 연결리스트를 끝까지 순회할 수 있다.

하지만 그렇게되면 head = head->next 이렇게 표현해야하므로

head가 첫번째 노드만을 가르키게 하는 역할이 사라진다

나중에 head에 NULL값이 저장된다!

1번만 순회하고 해당 연결리스트를 안쓰는 경우에는 문제가 안되겠지만 

보통은 재사용하기에 head를 이용한 순회를 하면 마지막에는 head에 NULL이 저장되므로

다시는 쓸수없다.

 

그래서 p라는 추가 변수에 head가 가르키는 주소를 복사받고 

p에 p->next 값을 저장하여 다음 노드의 주소를 받으며 계속 갱신함으로써

연결리스트 순회를 한다.

 

head 포인터는 첫번째 노드만을 가르키게한다!