[질문] C언어 더블링크드 리스트 질문입니다.
글쓴이: nerd™ / 작성시간: 수, 2004/03/31 - 10:00오전
책보고 공부 하면서 더블링크드로 주소록을 만들고 있습니다만
여기부분은 맞다고 생각되고 검토도 여러번 해보고 책도 참고 했는데
왜 안되는지 모르겠습니다.
도움좀 주세요!
1.첫번째 질문입니다.
[노드 상태] head - node1 - node2 - temp1 - tail ==> temp1이 tail앞까지 이동시키고 temp1과 tail사이에 temp2를 삽입하는 과정 head - node1 - node2 - temp1 - temp2 - tail [tail앞까지 넘겨주는 과정] temp1=head->next; while(temp1->next != tail) { temp1=temp1->next; } [소스1번] temp1->next=temp2; //1) temp2->prev=temp1; //2) temp2->next=tail; //3) tail->prev=temp2; //4) [소스2번] tail->prev->next=temp2; //1)temp1->next 과 tail->prev->next 차이점? tail->prev가 temp1같은거 아닌가요?. temp2->prev=tail->prev; //2)temp1 과 tail->prev의 차이점? 역시 tail->prev가 temp1이 아닌가요? temp2->next=tail; //3) 3과 4는 동일! tail->prev=temp2; //4)/* [출력결과 값이 다름!] 1번 쓰레기값과 마지막 도느 출력안됨! 2번 마지막 입력한 한개 노드 출력안됨!
소스1번과 소스2번의 1),2)번의 차이점이 있는지요?
출력을 했더니 1번소스로 출력할때와 2번으로 출력할때랑 다르더군요.
2.두번째질문은 출력에 관한 질문인데요.
출력이 데이터를 3개 입력하면 2개만 출력되고 4개 입력하면 3개만 출력되네요.
node *temp; temp = (node *)malloc(sizeof(node)); temp = head->next; if(temp->next == tail) { puts("###데이터가 없습니다!###"); menu(); } printf("Head Next %p\n", temp); puts("========================="); while(temp->next != tail) { printf("point ==> %p\n", temp); printf("번호: %d\n",temp->num); printf("이름: %s\n",temp->name); printf("전화번호: %s\n",temp->tel); printf("e-amil :%s\n",temp->mail); puts("========================="); temp=temp->next; }
어디가 문제인거죠?
첫번째 질문에 있는 곳에서 링크드연결이 잘 못된건가요?
도움좀 주세요!
혼자 공부 하다가 kldp에 처음으로 질문 올립니다.
질문하는 방식이 잘못됬다거나 그래도 양해해주시고 조언바랍니다.
제가 왕초보라서 쉽게 알려주시면 감사하겠습니다.
Forums:
1번은 소스를 몰라 정확히 모르겠지만 tail까지 넘겨주는 과정에 문제가
1번은 소스를 몰라 정확히 모르겠지만 tail까지 넘겨주는 과정에 문제가 있는 것 같습니다.
그리고 2번은 next가 tail이면 멈추므로 맨 마지막 것을 출력하기 전에 멈추게 되겠지요.
while(temp != tail) 로 바꾸셔야 할 거 같습니다.
그리고 temp는 이미 할당되어 있는 주소값을 넣어주기 위한 포인터 변수이므로 malloc는 필요없습니다.
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
Re: [질문] C언어 더블링크드 리스트 질문입니다.
중간에 마음대로 좀 잘라내겠습니다.
temp1 == tail->prev면 말씀하신대로 동일해야 합니다.
소스2번 들어가기 전에 temp1이 tail->prev와 다르지 않을까 싶네요.
한번 확인해보세요.
엇엇.. malloc했던 메모리가 새고 있습니다.
고치셔야 합니다.
출력 해결법은 eminency님이 말씀하셨으니...
그림을 그려가면서, (주로 포인터는 네모박스에서 화살표를 바깥방향으로 그리죠.)
고민하시면 쉽게 이해하실 수 있으실 겁니다.
댓글 달기