2016-06-30 17 views
0

頭と整数の要素(順序付けられていない)に接続された2つの循環的な二重リンクリストがあります。最初のリストで削除したいのは、2番目のリストの値が含まれています。どのように作業ポインタ?この排除をどうやって作るのですか? 2番目のリストを削除するには、最初のリストの値を検索する必要がありますか?どうすればそれらと仕事ができますか?それを解決するアルゴリズムの操作を説明することができますか?頭に接続された循環的な二重リンクリストの削除

Exemple:

私は頭を持つ2つの円形二重にリンクされたリストを持っています。

L1:40 100 90 20 10 32 66

L2:60 10 46 30 80 90

Iが最初のリストに第二にある値を削除します。最初のリストは、次のようになります。

L1:40 100 20 32 66

私はこの除外を行うために、リストのポインタを操作する方法について知っていただきたいと思います。私は擬似コードの概念を望んでいました。私はCでコードを作成するが、私はアルゴリズムを理解していない。私は以前のやり方を理解する必要があります。

+0

あなたが何を求めているのかはっきりしません。何か試しましたか? –

+0

私は頭を持つ2つの円形の二重リンクリストを持っています。 L1:40 100 90 20 10 32 66 L2:60 10 46 30 80 90 第2リストにある値を最初のリストから削除したいとします。最初のリストは次のようになります。 L1:40 100 20 32 66 この除外を行うために、リストの操作方法を知りたいと思います。私は擬似コードの概念を望んでいました。私はCでコードする必要がありますが、私はアルゴリズムを理解していません。私は以前のやり方を理解する必要があります。 –

+0

「手」とは何ですか?あなたは "頭"を意味しましたか? – Groo

答えて

1

まず、アルゴリズムの疑似コードを記述し、実際に関数を実装します。これは独立してテストできます。あなたのリストとノードを仮定

for each node in list1 
{ 
    if (list2 contains node) 
    { 
     remove node from list1 
    } 
} 

のようなものに定義されています:

一般的な擬似コードは次のようなものになるだろう

だから、
struct Node 
{ 
    struct Node *next; 
    struct Node *prev; 
    int number; 
} 

struct List 
{ 
    struct Node *head; 
} 

// these should be instantiated somewhere 
struct List* list1; 
struct List* list2; 

を、関数のスケルトンは次のようなものになるだろう

struct Node* node = list1->head; 

while (node != null) 
{ 
    // prepare the next node early 
    struct Node* next = node->next; 

    // check if list2 contains a matching node 
    if (match(list2, node->number)) 
    { 
     // remove the node properly, 
     // updating whatever you need to update 
     remove(list1, node); 
    } 

    // if it's circular, check if this 
    // is the last node 
    if (next == list1->head) 
     break; 

    node = next; 
} 

これで、2つの機能、すなわち

// returns true if any node in list contains the specified number 
bool match(struct List* list, int number); 

// removes the node from the list 
void remove(struct List* list, struct Node* node); 
関連する問題