choish4682   3년 전

혼자 테스트 할 때 결과는 정상적으로 출력 되는 것 같습니다. 입력 하나 받고 바로 출력하고, 다음 입력 받고 하긴 하지만 그렇게 해도 된다고 알고있어서...
살짝살짝씩 고치면서 여러번 해봤는데 50%까지 가다가 런타임 에러 날때도 있고, 대부분 바로 런타임에러가 납니다 ㅠㅠ... 이유를 모르겠어요...
리스트 구현을 여기저기 찾아가며 처음해본거라 도움부탁드립니다!!

dldyddlwl   3년 전

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년 전

와.... 정말 딱 적어주신거 수정해서 제출하니 바로 맞았습니다!!  연결해줄 때 좀 더 꼼꼼히 봐야겠네요..  ★ -> ○ -> ☆ 꼭 기억하고 열심히 해보겠습니다!! 정말 감사합니다ㅎㅎ!!

댓글을 작성하려면 로그인해야 합니다.