2016-06-20 6 views
0

リンクされた2つのリストを交換しようとしていますが、ソート関数は機能しません。どうすればノード全体を入れ替えることができますか?私がしようとしているのは、メンバーを交換する代わりに、リスト全体を交換することです。リンクリストノードをスワップする方法

typedef struct node 
{ 
    char   *first_name; 
    char   *last_name; 
    struct node *next; 
}person; 


person *new_p(char *name, char *last) 
{ 
    person *p; 

    p = malloc(sizeof(p)); 
    if (p) 
    { 
     p->first_name = name; 
     p->last_name = last; 
     p->next = NULL; 
    } 
    return (p); 
} 

void swap(person *a, person *b) 
{ 
    person tmp; 

    tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

void sort(person *s) 
{ 
    person *list; 

    list = s; 
    while (list->next) 
    { 
     if (strcmp(list->first_name, list->next->first_name) > 0) 
     { 
      swap(list, list->next); 
     } 
     list = list->next; 
    } 
} 
+0

問題を診断するためにここに十分ではありません。 [最小、完全、検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 – dbush

+0

完全な回答が得られるように[mcve]を投稿してください。しかし、 'next'ポインタが正しく更新されていない(またはまったく)ために、おそらく見えます。実際、リンクされたリスト内のノードを交換するには、 'next'ポインタを変更し、ノード全体をコピーしないでください。 – kaylum

+0

@kaylumここに完全なコードhttp://code.geeksforgeeks.org/da81PB –

答えて

1

あなたのスワップ機能は

...この重複が整理は、メモリを引き起こす可能性が...ノードデータとノードポインタなので、「スワップ」されている(nextポインタに関連するデータを含む)のデータをミキシングノード・チェーンが破損する可能性があります。あなたが運が良ければ、チェーンは元のままですが、2つのノードではなくサブセクション全体をスワップします。

// ugly, but should work 
typedef struct node { 
    char* first_name; 
    char* last_name; 
    struct node* next; 
} person; 

void swap(person* a, person* b) { 
    person tmp; 
    tmp.first_name = a->first_name; 
    tmp.last_name = a->last_name; 
    a->first_name = b->first_name; 
    a->last_name = b->last_name; 
    b->first_name = tmp.first_name; 
    b->last_name = tmp.last_name; 
} 

またはこの(あまり醜いと保守が容易):

typedef struct { 
    char* first_name; 
    char* last_name; 

} person_s; 

typedef struct person_nd person_nd; 

struct person_nd { 
    person_s data; 
    person_nd* next; 
}; 

void swap2(person_nd* a, person_nd* b) { 
    person_s tmp; 
    tmp = a->data; 
    a->data = b->data; 
    b->data = tmp; 
} 

これらはすべて醜いソリューションです(これは未テストコードです)、ノードのデータを入れ替える検討する

。正しい方法は、そのままデータを残して、ノードの位置を入れ替えることです。

これは、ノードリスト構造、具体的にはノードを参照するポインタのアドレスに関する詳細を知る必要があります。

一方、このタイプのソリューションはデータに依存しないため、データ構造の更新で実装を書き換える必要はありません。

すなわち、(これは間違いなく失敗しますが、それは概念を実証しなければならない):

void swap3(person_nd** a, person_nd** b) { 
    person_nd* tmp = *a; 
    // swap the position in the tree. 
    *a = *b; 
    *b = tmp; 
    // swap the "forward" branches 
    tmp = (*a)->next; 
    (*a)->next = (*b)->next; 
    (*b)->next = tmp; 
} 
関連する問題