다양한 알고리즘 문제가 있는 algospot의 HELLOWORLD문제(https://algospot.com/judge/problem/read/HELLOWORLD)를 풀기위해 C언어에서 Linked list를 구현해 보았다.
우선 Linked list란 말 그대로 연결된 리스트로 말보단 그림으로 보는게 더 직관적으로 이해될 것이다.
보통 한 노드에는 원하는 자료형으로 선언된 데이터와 다음 노드를 가리키는 노드로 구성되어있다. 그리고 제일 앞의 노드를 가리키는 head란 노드도 선언해준다. 이런식으로 새로운 값을 추가할 때 노드끼리 연결만 지어준다면 크기 배열과는 달리 비교적 제한없이 생성할 수 있다.
algospot의 문제를 보면 이름들을 입력받고 Hello, 이름!으로 출력해주는데 list에 입력받은 이름들을 담았다가 출력 시 다 뱉어내도록 해보자.
내가 계획한 linked list는 이런 형태이다.
head 노드가 맨 앞의 노드를 가리키는 것이 아니라 현재 새로 들어온 노드, 즉 제일 마지막의 노드를 가리키게 되는 기준과 같은 역할을 한다. 그리고 맨 뒤 노드의 다음노드가 맨 앞의 노드를 가리킴으로써 뒤와 앞이 연결되도록 한다.
linked list는 가리킴으로 서로 연결되므로 포인터의 사용이 중요하다. 따라서 node 구조체를 선언하고(typedef struct) node 구조체를 사용할 때 node *example; 이런식으로 선언해 노드들을 끌어다 쓴다.
앞에서 배열과는 달리 비교적 제한없이 생성할 수 있다고 했는데 연결지어서 생성되는 node 공간을 malloc으로 동적할당해주기 때문이다.
malloc이란 힙 영역에 메모리를 할당하는 함수인데 메모리 구조를 보면
여기서 malloc으로 메모리를 할당하면 HEAP영역에 할당이 된다. malloc 함수는 (void *)malloc(size_t size)로 선언하면 사용할 수 있는데 보다싶이 리턴이 void 이므로 사용하고자 하는 자료형으로 선언해줘야한다. malloc으로 신나게 할당만 시켜주면 메모리에 사용할 공간이 부족해질 수 있다. 따라서 malloc을 시켰으면 free를 해줘야한다. free는 동적할당된 공간을 풀어주는 함수이다.
Linked List를 구현하면서 문제를 푼 코드 https://github.com/chojpsh1/linkedlist/blob/master/helloworld.c
'STUDY' 카테고리의 다른 글
[ATOM] 아톰 SSH 연결하기 (0) | 2018.01.05 |
---|---|
라즈베리파이, 집에 놓고 다닐래!(외부 ip에서 내부 ip 접속하기) (0) | 2017.08.30 |
소켓으로 에코 프로그램, 1:1 채팅 프로그램 짜기 (0) | 2017.05.10 |
[2014 CODEGATE] weird shark (0) | 2017.02.02 |
패킷(Packet) 겉햝기 (0) | 2017.01.31 |