(C언어) 사용자가 입력한 만큼만 메모리 할당받기
사용자가 얼마만큼의 길이의 입력을 할 것인지 미리 알 수 있다면, 그만큼의 크기의 배열을 선언하여 사용할 수 있습니다. 하지만 그렇지 않은 상황에서는 어떻게 메모리를 할당받아야 할까요? 바로 연결 리스트를 사용하는 것이 핵심입니다. 사용자가 입력하는 글자 하나하나를 연결 리스트의 노드 하나하나에 각각 저장하면 됩니다.
1단계_ 필요한 헤더 파일
동적 할당 함수 'malloc'을 사용하기 위해서 <stdlib.h> 파일을 불러옵니다.
2단계_ 구조체 선언
연결 리스트를 구성하게 될 노드의 형식을 선언해줍니다.
하나의 노드에는 문자 1개가 저장될 변수 'character'와,
다음번 노드를 가르킬 포인터 'p_next'로 구성됩니다.
3단계_ AddCharacter 함수 선언하기
연결 리스트에 새로운 노드를 생성하여 새로운 데이터를 차곡차곡 저장해주는 함수 AddCharacter를 선언해봅시다.
우선 각 변수의 의미를 짚고 넘어가봅시다.
p_head | pp_head | p_tail | pp_tail |
연결 리스트의 첫 노드 를 가르키는 포인터 |
연결 리스트의 첫 노드 를 가르키는 포인터 를 가르키는 포인터 |
연결 리스트의 마지막 노드 를 가르키는 포인터 |
연결 리스트의 마지막 노드 를 가르키는 포인터 를 가르키는 포인터 |
*pp_head와 같다 | 즉 p_head를 가르키는 포인터 | *pp_tail과 같다 | 즉 p_tail을 가르키는 포인터 |
AddCharacter 함수는 연결 리스트의 처음과 마지막 가르쳐주는 이중 포인터 2개와 데이터 1개를 매개변수로 받아옴으로써 결과적으로 해당 연결 리스트의 제일 마지막에 새로운 데이터를 추가해주는 일을 수행합니다.
경우의 수는 2가지로 나뉩니다.
1) 기존 연결 리스트에 이미 노드가 있는 경우 → 즉 'p_head != NULL'인 경우 : if 문장을 수행합니다.
2) 기존 연결 리스트에 노드가 아무것도 없는 경우 → 즉 'p_head == NULL'인 경우 : else 문장을 수행합니다.
if ~ else 문을 수행하고오면 새로운 데이터가 입력될 새로운 노드 공간이 동적 할당됩니다. 그럼 이 새로운 노드에 데이터를 삽입함으로써 AddCharacter함수는 역할을 완수하고 종료합니다.
4단계_ 실제로 사용하기
p_head는 첫 노드를,
p_tail은 마지막 노드를,
p는 현재 보고 있는 노드를
가르키는 포인터입니다.
이제 반복문을 이용하여 사용자에게 문자를 입력받습니다.
만일 사용자가 널문자('\n')를 입력하면 반복문을 탈출함으로써 입력을 중단합니다.
문자를 하나하나 입력받을 때마다 temp변수에 임시로 저장해준 뒤, 아까 선언한 AddCharacter함수를 불러와 연결 리스트에 차곡차곡 쌓아줍니다.
마지막 반복문은 연결 리스트를 모두 사용하고 난 뒤 모든 노드를 삭제해줍니다.