2013-10-15 2 views
0

노드 구조체 (나이) 내에서 int 값으로 DLL을 재정렬하려고합니다. 그것은 int에 직접 액세스 할 때 작동하지만 전체 노드를 바꿔서리스트가 재정리 될 때 구조체의 모든 변수를 바꿀 필요가 없습니다.이중 연결 목록 노드 스와핑 문제

void DLL::ReOrg(node* head, int DLL_Size) 
{ 

node* temp = head; 
int holder; 


for(int j = 0; j < DLL_Size; j++) 
{ 

     while(temp != NULL) 
     { 

        if (temp->next != NULL && (temp->age < temp->next->age)) 
        { 
         holder = temp->age; 

         temp->age = temp->next->age; 
         temp->next->age = holder; 
        } 
        else 
          temp = temp->next;//increment node 
      } 
      temp = head; 

} 


} 

이 작동하지만 내가 좋아하는 뭔가를하려고하면

node* holder; 

... 

holder = temp; 
temp = temp->next; 
temp->next = holder; 

내 프로그램을 컴파일하고 빈 화면이 실행됩니다. 모든 지침을 부탁드립니다. 나는 모든 변수를 바꾸는 것이 더 쉬울 것이라고 생각한다. (많지는 않다.)하지만 코드를 더 깨끗하게 만들고 싶었다. 감사.

답변

0

실제로 노드를 다시 링크하지 않아서 무한 루프가 발생하기 때문입니다. 이전 노드의 링크와 다음 노드의 prev 링크를 next 링크로 변경해야합니다.


하면 목록은 이중 연결, 당신은 다음과 같은 것을 할 수있는, 이전 포인터와 다음 포인터를하는 경우 : 난 내 초기 링크 포인터를 잃어 추측하고있어

node* next = temp->next; 

// Fix the links of the previous node, and the next-next node 
if (temp->prev) 
    temp->prev->next = next; 

if (next->next) 
    next->next->prev = temp; 

// Relink the two nodes that should be swapped 
temp->next = next->next; 
next->next = temp; 

next->prev = temp->prev; 
temp->prev = next; 
+0

을 . 나는 당신이 말한 것처럼 prev-> next & next-> next-> prev를 추가하려고 시도하고 있지만 여전히 비어 있습니다. 내가 링크드리스트를 싫어한다. – GeorgeCostanza

+0

@GeorgeCostanza 코드를 다시 연결하는 몇 가지 예를 추가했다. –

+0

나는 거의 다 왔지만, 어떤 이유로 ReOrg 중에 노드가 없어지고있다. 무슨 일이 일어나고 있는지 보여줄 그림이 있습니다. http://i.imgur.com/U3BGstr.png 시간을내어 주셔서 감사합니다. 머리와 꼬리 포인터가 첫 번째 노드와 마지막 노드를 가리키고 있습니다. head-> prev 및 tail-next는 NULL입니다. – GeorgeCostanza