2017-04-21 52 views
0

我使用這種排序功能,但我不知道如何交換節點地址而不是值。我使用雙向鏈表。如何交換鏈接列表中的節點而不交換C語言中的數據?

謝謝

void sort(LISTnode **h) { 
    LISTnode * start, * min, * temp; 
    int num; 
    start = *h; 
    while (start->next != NULL) { 
     temp = start; 
     min = temp; 
     temp = temp->next; 

     while (temp != NULL) { 
      if (temp->number < min->number) 
       min = temp; 
       temp = temp->next; 
     } 

     // This part of the code 
     num = min->number; 
     min->number = start->number; 
     start->number = num; 

     start = start->next; 
    }  
} 
+1

爲了交換節點,您需要先前的節點到您要交換的節點,因爲必須調整其下一個指針。 – FernandoZ

+0

歡迎來到StackOverflow。 請參考[遊覽] 學習問好問題stackoverflow.com/help/how-to-ask, 作[mcve]。 – Yunnosch

回答

1

交換兩個節點(編輯:非相鄰 - 特殊處理需要爲下面的代碼將設置涉及到下一個/上指針的一部分回自己的對象!在相鄰節點!!!):

x->prev->next = y; 
x->next->prev = y; 

y->prev->next = x; 
y->next->prev = x; 

現在的節點改變列表中的自己的立場,需要調整節點本身:

tmp = x->prev; 
x->prev = y->prev; 
y->prev = tmp; 

tmp = x->next; 
x->next = y->next; 
y->next = tmp; 

最後:調整頭指針:

if(list->head == x) 
{ 
    list->head = y; 
} 
else if(list->head == y) 
{ 
    list->head = x; 
} 

做...

好,中途只:以上適用於一個雙和循環鏈表(在那裏你可以得到的尾巴通過list->head->previous)。如果你沒有一個循環鏈表,在第一個代碼段(第二個你不需要的,假設x和y都不爲空)上加上適當的空指針檢查,然後對尾部進行頭部調整也是。

邊注:由於不必調整頭(和尾,如果需要的話),你不能沒有節點的父列表安全地交換的...

這是相當多的指針調整的必要,但。我寧願考慮交換節點內的數據(儘管在你的問題中明確排除!)。如果你不想這樣做是因爲數據量很大,那麼考慮將數據與節點分開存儲,並讓節點有一個指向數據的指針。交換然後就被交換兩個指針,你甚至不需要養育列表對象...

+0

也見[這裏](https://pastebin.com/HC1DLK4M) – sp2danny

+0

如果x和y恰好相鄰,這將會失敗慘劇 – joop

+0

@joop哦,是的,你是如此的正確......爲...添加了一個提示是我在結論中所建議的更多關於數據交換的論點之一...... – Aconcagua

0

替代方法..
相反,它更容易使用掉雙指針指針指針操縱的..

void swap(Node* &a,Node* &b){ 
    Node* c=a,a=b,b=c; 
} 

void swapNodes(Node** head_ref, int x, int y) 
{ 
    Node**a=NULL,**b=NULL; 
    Node* head=*head_ref; 
    while(head!=NULL){ 
     if(head->data==x) *a=head; 
     else if(head->data==y) *b=head; 
    } 
    if(a&&b){ 
     swap(*a,*b); 
     swap((*a)->next,(*b)->next); 
    } 
}