C - 열거형 (Enum)
C - Linked List 구현
RBTree 구현 전, C에 익숙해지기 위해 Linked List 를 C로 구현하였다.
연결리스트의 동작 방식에 대한 복습 후, 기본적인 insertion, deletion, search, print, clearMemory 등은 인터넷의 소스 코드를 참조했다. 그 후 사용자가 원할 때까지 명령을 반복적으로 입력받을 수 있도록 무한루프 및 switch 를 사용하여 스스로 코드를 보완했다.
값의 크기를 비교해가며 삽입과정에서 정렬이 되도록 할지 고민했는데, 그 부분은 차후 이진 트리에서 구현하기로 결정했다. insert
는 연결리스트의 마지막에 계속 삽입되고, delete
는 연결리스트의 헤더와 가까운 값이 가장 먼저 삭제된다.
예외처리 같은 경우 맨 처음엔 각 기능별로 함수를 모두 정의하였으므로 함수 내에서 처리하였으나, 삭제
, 검색
, 출력
은 모두 리스트에 값이 존재할 때에만 가능하기 때문에 command 값을 확인 후 위 3개 종류는 조건문 처리를 통해 Head Node
가 NULL 이 아닐 때에만 해당 switch
구문으로 이동하도록 했다.
가장 심각한 오류는, 명령(정수형) 입력시 '방향키'를 오입력하게 되면, printf
함수들이 무한 출력되는 현상이었다. 옆의 RBTree
를 이미 구현한,, 동기에게 물었으나 터미널 문제라는 답만을 확인할 수 있었고, 결국 챗 GPT 를 통해 답을 얻을 수 있었다.
scanf
를 통해 입력받은 값이 올바른지 검증하는 부분이 없어 발생한 문제였고, 해결 방법은 두 가지였다.
첫번째로 'scanf'
의 리턴값을 검증한 뒤 사용자가 올바른 값을 입력할 때까지 반복하는 방법이 있다.
두번째로 'scanf'
의 리턴값을 정수형 (%d)
이 아닌 문자열 (%s)
로 받은 뒤 이를 분석하여 유효한 명령인지 확인하는 방법이다.
나는 전자를 택하여 코드를 수정했고, 다음은 오류처리 과정이다.
코드
for (;;) {
printf("명령을 입력해주세요: ");
// 입력값에 대한 검증 X
scanf("%d", &command);
터미널
loop ...ing
코드
for (;;) {
printf("명령을 입력해주세요: ");
// 입력에 대한 검증 후, 올바른 입력이 들어올 때까지 반복
while (scanf("%d", &command) != 1) {
printf(">>>>> 잘못된 입력입니다. 다시 입력해주세요. <<<<<\n");
while (getchar() != '\n'); // 버퍼 비우기
printf("명령을 입력해주세요: ");
}
터미널