2017-04-21 5 views
0

私はこのソート機能を使用しますが、値の代わりにノードアドレスをスワップする方法はわかりません。私は二重リンクリストを使用します。 C言語でデータをスワップせずにリンクリスト内のノードをスワップする方法はありますか?

はあなたに2つのノード(スワップ

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へ。 [ツアー]を取ってください。[mcve]を作ってください。 よくある質問stackoverflow.com/help/how-to-ask、 を作成してください。 – 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が両方ともヌルではないと仮定して、2番目のコードセクションは必要ありません...)。そして、テールのヘッド調整を行います、あまりにも。しかし、必要なポインタ調整のかなり多くありますので、(必要であれば、そして尾)ヘッドを調整するのでは、ノードの親リストなしで安全に交換することはできません...

、:

サイドノート。むしろ、ノード内でデータを交換することを検討したいと思います(あなたの質問では明示的に除外されています)。データが大きいためにそうしたくない場合は、ノードとは別にデータを格納し、ノードにデータへのポインタを持たせることを検討してください。スワップするだけで2つのポインタが交換され、子リングリストオブジェクトは必要ありません。

+0

[こちら](https://pastebin.com/HC1DLK4M)も参照してください – sp2danny

+0

xとyが隣接している場合、これは悲惨に失敗します – joop

+0

@joopああ、そうですよ、私が結論としてお勧めしたように、データの切り替えにとどまるためには1つの議論である... – Aconcagua

0

代替メソッド..
ポインタで操作する代わりに、ポインタを2重ポインタでスワップする方が簡単です。

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); 
    } 
} 
関連する問題