2017-06-18 6 views
2

今、私はC++を使用してアルゴリズムの紹介をしています。 質問です:クラスへのポインタへの符号なしlong back

代わりに、通常の2(次とPREV)の項目ごとに1つだけのポインタ 値x.npを使用して二重リンクリストを実装する方法について説明します。 と仮定すると、すべてのポインタ値はkビット整数として解釈され、 はx.np = x.next XOR x.prev、x.next およびx.prevのkビット "排他的論理和"を定義します。 (値NILは0で表されます)。 は、リストの先頭にアクセスするために必要な情報を記述してください。 にそのようなリストのSEARCH、INSERT、およびDELETE操作を実装する方法を示します。 O(1)時間にそのようなリストを逆にする方法も示します。

XOR関数では、まずクラスへのポインタをunsigned longに変換し、これらの2つの値をXORします。そして、結果をクラスへのポインタに変換する。私はなぜそれが動作しないのか分からない。ここに私のコードは次のとおりです。

struct node 
{ 
int key; 

node *np; 
} ; 

struct list_n 
{ 
node *head; 

node *tail; 
}; 

は、上記の2つの構造体であり、以下の下に挿入

void insert_element(list_n *_list, int _key) 
{ 
    node *present_node= new node; 

    present_node->key=_key; 

    present_node->np=xor_gate(nullptr,_list->tail); 

    if(_list->tail) _list-> tail->np=xor_gate(present_node,xor_gate(nullptr,_list->tail->np)); 

    if(!_list->head) _list->head=present_node; 

    _list->tail=present_node; 
} 

あるXORゲートさ:

node *xor_gate(node *left,node *right) 
{ 
    unsigned long result; 

    result = (reinterpret_cast<unsigned long>(left))^(reinterpret_cast<unsigned long>(right)); 

    node *output =new node; 

    output = reinterpret_cast<node*> (result); // yes or no 

    return output ; 
} 


void list_n_inti(list_n *a) 
{ 
    a->head =nullptr; 

    a->tail =nullptr; 
} 

私はコード数回見直しています。私は問題がXORゲートによって引き起こされると思う。

バグが見つかった場合は教えてください。そして、あなたはこの質問に答える他の方法があれば。教えてください。

はあなた

+0

サイズやポインタのサイズと一致しない場合があり、 'あり:: PTRの値を保持することができるSTD :: uintptr_t'整数型。 'xor_gate'の' output'は新しく割り当てられた 'node'インスタンスで初期化されますが、直ちに別の値で上書きしてメモリリークを起こします。 C++ではコンストラクタを使って初期化を行い、 'list_n_inti'のような関数は通常smellyコードを示します。 – VTT

+0

' node * output = new node;出力= reinterpret_cast (結果); '2番目のステートメントは最初のステートメントによって格納された値を上書きし、' new node'によって与えられたポインタはなくなります。 –

+0

あなたのお返事ありがとうございます。私はあなたが言及したように自分のコードを変更しました。この行にはまだ1つのエラーがあります。 present_node-> np = xor_gate(nullptr、_list-> tail); 2番目の入力をnullptrに変更すると、このプログラムは動作します。私はなぜそれが起こるのか分かりません。 –

答えて

1

xor_gateでメモリリークがありますありがとう、私はあなたが32ビットとしてコンパイル場合は、コードがうまくいくと思います。それを64ビットとしてコンパイルすると、unsigned longには一般的にポインタを含めることができません。

この試す:unsigned long型メインの

#include <cstdint> // for uintptr_t 

node *xor_gate(node *left,node *right) 
{ 
    using std::uintptr_t; 

    uintptr_t result = (reinterpret_cast<uintptr_t>(left))^(reinterpret_cast<uintptr_t>(right)); 

    return reinterpret_cast<node*> (result); 
} 
関連する問題