2013-10-15 36 views
0

我想通过节点struct(age)内的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

这是因为你实际上没有重新链接节点,所以你会得到一个无限循环。您需要更改前一个节点的next链接以及下一个下一个节点上的prev链接。


如果你的名单双向链接,和你有一指针和下一指针,那么你可以做这样的事情:

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