[CS50] 연결리스트 : 코딩

제리·2022년 6월 18일
0

CS50

목록 보기
9/13

사전 구조체 정의 코드 (연결리스트 : 도입 강의 중)

#include <stdio.h>
#include <stdlib.h>

//연결 리스트의 기본 단위가 되는 node 구조체를 정의합니다.
typedef struct node
{
    //node 안에서 정수형 값이 저장되는 변수를 name으로 지정합니다.
    int number; 

    //다음 node의 주소를 가리키는 포인터를  *next로 지정합니다.
    struct node *next;
}
node;

첫 연결리스트를 구현하기 위해서는 빈 박스(포인터)가 필요하다.
빈 박스를 list라고 해보고 이것을 다음 node를 가리키는 포인터로 정의하자.

node *list = NULL; // 메모리 위치로 갔을때 값이 없을 경우 NULL로 표기한다.

다음으로, 2와 포인터를 정의하기 위해서 malloc() 함수로 메모리 공간을 가져온다.

node *n = malloc(sizeof(node)); // n이라는 포인터에 새로운 메모리 공간 할당

할당한 메모리 공간에 2를 넣어주고, 포인터에 NULL값을 할당해준다.

if (n != NULL) // malloc() 함수를 사용할때마다 반환된 값이 NULL인지 확인해줘야함
{
  (*n).number = 2; // n에 있는 주소로 가서 number의 값을 0으로 바꿔라
  n->number = 2; // 위표현과 같은 뜻
  n->next = NULL; // 2 밑에있는 메모리 공간 포인터
}

그리고 화살표(list박스 -> 2) 처럼 포인터가 n의 주소를 가리키기 위해 아래처럼 할당해준다.

list = n; // list 포인터에 n 포인터를 할당해준다.

이제 2 아래에 있는 공간에서 4를 가르키도록 구현해보자.

n = malloc(sizeof(node)); // 새로운 메모리공간 할당
if (n == NULL) // malloc() 썻으면 널체크
{
	return 1; // NULL이면 프로그램을 멈춰라
}

n->number = 4; // 윗칸에 4 할당
n->next = NULL; // 포인터에 NULL 할당

list->next->next = n; // 4 아래 공간 포인터에 n 새로운 메모리 공간 할당

이제 number 들을 출력하고, 메모리 공간을 해제해준다.

// 이제 list에 연결된 node를 처음부터 방문하면서 각 number 값을 출력합니다. 
// 마지막 node의 next에는 NULL이 저장되어 있을 것이기 때문에
// 이 것이 for 루프의 종료 조건이 됩니다.
for (node *tmp = list; tmp != NULL; tmp = tmp->next)
{
    printf("%i\n", tmp->number);
}

// 메모리를 해제해주기 위해 list에 연결된 node들을 처음부터 방문하면서 free 해줍니다.
while (list != NULL)
{
    node *tmp = list->next;
    free(list);
    list = tmp;
}
profile
iOS 준비중

0개의 댓글