2010-04-30 4 views
2

안녕하세요, 나는 숙제를 위해 노력하고있어, 나는 센티널없이 원형 ​​연결 deque를 역전하려고 노력하고있어. 여기 내 데이터 구조는 다음과 같습니다센티널없이 원형 ​​deque를 반전

struct DLink { 

TYPE value; 

struct DLink * next; 

struct DLink * prev; 
}; 

struct cirListDeque { 

int size; 
struct DLink *back; 
}; 

여기 내 방법은 양단 큐 반전에있다 :

void reverseCirListDeque(struct cirListDeque* q) { 

struct DLink* current; 

struct DLink* temp; 



temp = q->back->next; 

q->back->next = q->back->prev; 

q->back->prev = temp; 



current = q->back->next; 

while(current != q->back) { 

    temp = current->next; 

    current->next = current->prev; 

    current->prev = temp; 



    current = current->next; 

} 

} 

을 내가 그것을 실행하고 (에 값 1, 2, 3을 넣어 그러나 유형에 대한 단지의 별칭입니다 이 경우에는 int) 그리고 그것을 반대로하면 2, 1, 3이됩니다. 누군가 내가 잘못하고있는 것에 대한 아이디어가 있습니까?

미리 감사드립니다.

답변

1
current = q->back->next; 

while(current != q->back->next) 
{ 
    /* This code will never run, cause you guaranteed right before the while 
    * that current == q->back->next . 
    */ 
} 

업데이트 : 당신은 당신이 (당신의 결과에 의해 판단, 지금 작동하는 것 같다) 모든 포인터를 반전 일단, 지금해야 할 일은, 이전> 백 당신의 "뒤로"포인터를 설정합니다.

+0

고맙습니다. 그러나 위의 코드에서 변경된 새로운 변경 사항은 3, 2, 1 대신 2, 1, 3을 인쇄합니다. – SDLFunTimes

+0

내 업데이트를 참조하십시오. :) q-> back-> next (포인터를 교환 한 후 q-> back-> prev가됩니다)는 이전 목록의 헤드이므로 새 포인터의 꼬리가됩니다. – cHao

+0

고맙습니다. 문제 해결됨. – SDLFunTimes

2

포인터가 관련 될 때마다 목록, 큐, 퀴즈 (deques)와 같은 추상 데이터 유형을 사용하여 작업 할 때마다 실제로 데이터 구조와 포인터를 종이에 다이어그램으로 그립니다. 모든 것에 라벨을 붙이십시오. 그런 다음 코드를 작성하십시오. 정말 쉽습니다. 나는 대학 때부터 deques를 사용하지 않았지만, 문제가 될 수 있으므로 prev, next, back을 혼동하지 않도록 확인하십시오. 또한 역 참조하기 전에 널 포인터를 확인하십시오.

이 정보는 직접 답변을주지 않고도 도움이되기를 바랍니다. 교수님이 그 점을 높이 평가할 것입니다. ;-)

0

이 작업을 수행하는 가장 쉽고 빠른 방법은 대기열의 방향에 대한 해석 만 변경하는 것입니다.

방향은 cirListDeque에 저장되고 노드에서 노드로 이동은 대기열의 현재 방향에 대한 지식으로 수행됩니다.

1

문제의 직접적인 대답은 아니지만 학교에 돌아 왔을 때, Data Display Debugger은 이와 같은 디버깅 문제에서 매우 중요합니다.