55번째줄 코드, 아래쪽 코드를 잘 살펴봅시다! 알아보기 쉽게 다음과 같이 써보겠습니다.
처음에, del이라는 노드 포인터를 동적할당했습니다. 그리고, del에게 현재 cur의 주소를 줍니다. 그리고 cur는 원래 cur의 이전의 주소를 갖게 됩니다.
prev -> cur -> next 가 cur -> del -> next 로 바뀌었습니다.
자 55번째의 if문으로 들어가게 되면, cur -> next = del-> next 입니다. del을 삭제하려고 하니, cur -> next가 del -> next가 되는 겁니다. 맞죠, 그리고 그 다음도 마찬가지로,
del이 삭제되니까, del의 next의 prev는 cur이 되어야합니다. 그런데 문제는 그 다음입니다!!!! del -> prev는 저희가 54번째 줄에 current = del -> prev라고 했었죠!!!!
del -> prev는 cur입니다. 그렇다면, del -> prev를 NULL로 초기화하는것은 cur을 NULL로 초기화시키게 되는 것입니다. 매우 위험한 일이죠!
===============================================================================================================================================
자, 이와 비슷하게 77번째 줄입니다.
새로운 글자가 추가되는데, 이미 next에 다른 친구가 있는 경우입니다. 이 때,
cur -> new node -> next
다 잘 연결해주셨습니다, 그런데 막상 원래 next의 prev를 new node와 연결해주지 않으셨습니다.
그러니까, cur - > new node -> next ( 이 방향은 문제 없습니다 그런데 )
cur <- new node ? next 가 되어버린 것이죠, next의 prev가 new node가 아닌, 여전히 이전의 cur을 가리키고 있습니다!!! 그렇게 되면, prev를 이용하는 '<' , '>' , '-' 를 다루는
알고리즘 부분의 신뢰성이 흔들리게 됩니다. ( current -> next -> prev 가 new node를 가리키지 않음 )
====================================================
따라서 위와 같은 부분이 런타임에러를 일으키는 원인이었습니다! 처음이라고 하셨는데 잘하셨네요!!
그림을 그려가면서 ★ -> ○ -> ☆, 하시면 위와 같은 실수를 줄이는 데 도움이 됩니다!!
choish4682 3년 전
혼자 테스트 할 때 결과는 정상적으로 출력 되는 것 같습니다. 입력 하나 받고 바로 출력하고, 다음 입력 받고 하긴 하지만 그렇게 해도 된다고 알고있어서...
살짝살짝씩 고치면서 여러번 해봤는데 50%까지 가다가 런타임 에러 날때도 있고, 대부분 바로 런타임에러가 납니다 ㅠㅠ... 이유를 모르겠어요...
리스트 구현을 여기저기 찾아가며 처음해본거라 도움부탁드립니다!!